【问题标题】:strange haskell parse error奇怪的haskell解析错误
【发布时间】:2015-05-23 09:47:11
【问题描述】:

所以我对 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 绑定中使用保护非常奇怪。为什么不直接使用if-then-else 表达式呢?
  • 好吧,我是haskell的新手,但我的意图是实现类似: if(condition 1){ if(condition 2) return value 1 else return value 2} 我曾希望这样做使用嵌套守卫,直到我意识到 haskell 不支持它们,所以我希望模拟嵌套守卫,外部守卫返回 x 和 x 由内部守卫指示

标签: haskell parse-error


【解决方案1】:

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

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

要了解如何以更常用的 Haskell 方式编写代码,我建议查找现有的 haskell 库和程序(例如在 hackage 上)以了解 let 和 @ 987654325@ 绑定通常有效。一般来说,我发现对于纯函数,我几乎只使用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 方面的专家,但我认为缩进最重要的一点是事物排列整齐,而不是它们处于一定深度。例如,如果将 a = 2 行缩进 2 个空格,则会出现解析错误。但是,如果你缩进 where 块 2 个空格和 x,a,b, and tau` 2 个空格的定义,所以它们都排成一行,它会编译得很好。再一次,只要看看一些现有的 Haskell 项目,你就会对它有所了解。
  • 另外,请确保始终使用空格而不是制表符缩进(或更改您的编辑器,使其使用空格作为制表符),它们会更好地工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多