奇怪的 haskell 解析错误
strange haskell parse error
所以我对 Haskell 的经验很少,并且我一直在研究下面的程序来实现搜索以在函数中找到最大值,但我收到了一个奇怪的错误。当我编译它时说:
MaximaSearch.hs:26:1:
解析错误(可能是缩进不正确或括号不匹配)
那一行 "main = do" 所以我认为这是我在它前面的代码中缩进的某种尾随错误,但我找不到任何错误...
代码如下:
module Main where
g :: Float -> Float
--your function here
g x = cos(x^2)
--goldenSectionSearch
goldenSS :: (Float -> Float) -> Float -> Float -> Float -> Float -> Float
goldenSS f a b c tau
| (c-a) < tau * (abs b + abs x) = (c+a)/2
|f x > f b = let
t1|(c - b) > (b-a) = goldenSS f b x c tau
|otherwise = goldenSS f a x b tau
in t1
|otherwise = let
t2|(c-b) > (b-a) = goldenSS f a b x tau
|otherwise = goldenSS f x b c tau
in t2
where
let x
| (c-b) > (b-a) = b + resphi*(c-b)
|otherwise = b - resphi*(b-a)
where resphi = 2 - phi where phi = (1+ sqrt 5)/2
in x
--main
main = do
print x
print (g x)
where
x = goldenSS g a ((a+b)/2) b tau
where
a = 2
b = 3
tau = 0.001
有什么想法吗?
您收到解析错误的原因是代码中 let
和 where
绑定的非惯用用法。
Haskell 允许多个句法结构用于临时绑定和模式匹配,但是您以一种相当奇怪和混乱的方式组合它们。
要了解如何以 Haskell 更常见的方式编写更清晰的代码,我建议您查找现有的 haskell 库和程序(例如 hackage ) 来了解 let
和 where
绑定通常是如何工作的。一般来说,我发现对于纯函数,我几乎只使用 where
(而不是 let
),但某些东西是风格化的。
至于这段代码,我对其进行了一些修改以使用 where
绑定而不是 let
,它现在可以为我编译和运行。即使你必须稍微调整一下才能让它为你编译,这个整体结构更清晰并且不太可能给你解析错误:
module Main where
g :: Float -> Float
g x = cos(x^2)
goldenSS :: (Float -> Float) -> Float -> Float -> Float -> Float -> Float
goldenSS f a b c tau
|(c-a) < tau * (abs b + abs x) = (c+a)/2
|f x > f b = t1
|otherwise = t2
where x | (c-b) > (b-a) = b + resphi*(c-b)
|otherwise = b - resphi*(b-a)
resphi = 2 - phi
phi = (1+ sqrt 5)/2
t1 |(c - b) > (b-a) = goldenSS f b x c tau
|otherwise = goldenSS f a x b tau
t2 |(c-b) > (b-a) = goldenSS f a b x tau
|otherwise = goldenSS f x b c tau
main =
do
print x
print (g x)
where x = goldenSS g a ((a+b)/2) b tau
a = 2
b = 3
tau = 0.001
所以我对 Haskell 的经验很少,并且我一直在研究下面的程序来实现搜索以在函数中找到最大值,但我收到了一个奇怪的错误。当我编译它时说:
MaximaSearch.hs:26:1: 解析错误(可能是缩进不正确或括号不匹配)
那一行 "main = do" 所以我认为这是我在它前面的代码中缩进的某种尾随错误,但我找不到任何错误...
代码如下:
module Main where
g :: Float -> Float
--your function here
g x = cos(x^2)
--goldenSectionSearch
goldenSS :: (Float -> Float) -> Float -> Float -> Float -> Float -> Float
goldenSS f a b c tau
| (c-a) < tau * (abs b + abs x) = (c+a)/2
|f x > f b = let
t1|(c - b) > (b-a) = goldenSS f b x c tau
|otherwise = goldenSS f a x b tau
in t1
|otherwise = let
t2|(c-b) > (b-a) = goldenSS f a b x tau
|otherwise = goldenSS f x b c tau
in t2
where
let x
| (c-b) > (b-a) = b + resphi*(c-b)
|otherwise = b - resphi*(b-a)
where resphi = 2 - phi where phi = (1+ sqrt 5)/2
in x
--main
main = do
print x
print (g x)
where
x = goldenSS g a ((a+b)/2) b tau
where
a = 2
b = 3
tau = 0.001
有什么想法吗?
您收到解析错误的原因是代码中 let
和 where
绑定的非惯用用法。
Haskell 允许多个句法结构用于临时绑定和模式匹配,但是您以一种相当奇怪和混乱的方式组合它们。
要了解如何以 Haskell 更常见的方式编写更清晰的代码,我建议您查找现有的 haskell 库和程序(例如 hackage ) 来了解 let
和 where
绑定通常是如何工作的。一般来说,我发现对于纯函数,我几乎只使用 where
(而不是 let
),但某些东西是风格化的。
至于这段代码,我对其进行了一些修改以使用 where
绑定而不是 let
,它现在可以为我编译和运行。即使你必须稍微调整一下才能让它为你编译,这个整体结构更清晰并且不太可能给你解析错误:
module Main where
g :: Float -> Float
g x = cos(x^2)
goldenSS :: (Float -> Float) -> Float -> Float -> Float -> Float -> Float
goldenSS f a b c tau
|(c-a) < tau * (abs b + abs x) = (c+a)/2
|f x > f b = t1
|otherwise = t2
where x | (c-b) > (b-a) = b + resphi*(c-b)
|otherwise = b - resphi*(b-a)
resphi = 2 - phi
phi = (1+ sqrt 5)/2
t1 |(c - b) > (b-a) = goldenSS f b x c tau
|otherwise = goldenSS f a x b tau
t2 |(c-b) > (b-a) = goldenSS f a b x tau
|otherwise = goldenSS f x b c tau
main =
do
print x
print (g x)
where x = goldenSS g a ((a+b)/2) b tau
a = 2
b = 3
tau = 0.001