所以我对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
任何想法?
答案 0 :(得分:1)
您获得解析错误的原因源于您的代码中let
和where
绑定的非惯用用法。
Haskell允许多个句法结构用于临时绑定和模式匹配,但是你以相当奇怪和混乱的方式组合它们。
要了解如何编写代码清理程序并以更常用的方式编写Haskell,我建议查找现有的haskell库和程序(例如在hackage上)以了解如何{ {1}}和let
绑定通常有效。一般来说,我发现对于纯函数我几乎只使用where
(而不是where
),但某些事物是风格的。
至于这段代码,我修改了一下使用let
绑定而不是where
,它现在为我编译并运行。即使你必须稍微调整它以便为你编译它,这个整体结构更清晰,不太可能给你解析错误:
let