奇怪的 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      

有什么想法吗?

您收到解析错误的原因是代码中 letwhere 绑定的非惯用用法。

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

要了解如何以 Haskell 更常见的方式编写更清晰的代码,我建议您查找现有的 haskell 库和程序(例如 hackage ) 来了解 letwhere 绑定通常是如何工作的。一般来说,我发现对于纯函数,我几乎只使用 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