奇怪的haskell解析错误

时间:2015-03-20 03:19:54

标签: 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      

任何想法?

1 个答案:

答案 0 :(得分:1)

您获得解析错误的原因源于您的代码中letwhere绑定的非惯用用法。

Haskell允许多个句法结构用于临时绑定和模式匹配,但是你以相当奇怪和混乱的方式组合它们。

要了解如何编写代码清理程序并以更常用的方式编写Haskell,我建议查找现有的haskell库和程序(例如在hackage上)以了解如何{ {1}}和let绑定通常有效。一般来说,我发现对于纯函数我几乎只使用where(而不是where),但某些事物是风格的。

至于这段代码,我修改了一下使用let绑定而不是where,它现在为我编译并运行。即使你必须稍微调整它以便为你编译它,这个整体结构更清晰,不太可能给你解析错误:

let