【问题标题】:Haskell - parse error on input `|'Haskell - 输入“|”解析错误
【发布时间】:2013-03-20 16:49:48
【问题描述】:
pow1 b e  
| (e == 0)  = 1  
| otherwise = b * pow1 b (e-1)

我在 .hs 文件中有确切的代码,加载时我总是得到相同的解析错误。我不认为它实际上包含任何错误 - 所以我目前的想法是“|”标志不是 haskell 想要的,但它是我的 Macbook 键盘(使用 Mac OS)上的标准。有可能吗,如果可以,我该如何解决?我目前正在使用 TextEdit 编写代码,并启用纯文本设置。

【问题讨论】:

  • 我强烈建议使用一个好的 Haskell 编辑器(Vim、Emacs、Sublime Text 2)而不是 TextEdit。

标签: haskell


【解决方案1】:

一定要缩进守卫; Haskell 有大量空白。

pow1 b e
    | (e == 0)  = 1
    | otherwise = b * pow1 b (e-1)

【讨论】:

  • 再补充一点:用空格缩进,not 制表符。 (例如,确保您的编辑器将制表符转换为空格。)
  • Haskell 有很大的空白,除非你想写你的代码到处都是括号
【解决方案2】:

你需要做的就是在守卫前面添加空格,代码就可以正常工作了。

pow1 b e  
    | (e == 0)  = 1  
    | otherwise = b * pow1 b (e-1)

(user142019已经说明了这个解决方案,但是我觉得需要解释一下才能理解这个解决方案)

说明:

Haskell 使用空格缩进来控制其代码的结构和范围。其他编程语言(例如 Java)依靠花括号来执行此操作,而 Haskell 则使用缩进。

您的代码不起作用,因为 Haskell 期望函数体的缩进级别比函数定义和同一级别的其他函数定义更深。同一缩进级别上的任何新行都将被尝试解释为新的函数定义,不允许以 | 的守卫开头,因此会出现解析错误。

Mac 字符键和文本编辑器都没有问题。

关于缩进的话题:制表符不起作用。因此,您必须手动输入空格或更改编辑器的制表符设置以插入 4 个空格(我建议)而不是制表符。 (例如,Notepad++ 允许这样做,这是我与 Haskell 一起使用的首选)。

【讨论】:

    【解决方案3】:

    除了记住缩进,在the website看到这句话我第一次启动Haskell:

    注意函数名和参数后面没有=, 在第一个守卫之前。许多新手会遇到语法错误,因为他们有时会把它放在那里。

    这也很重要。

    @Greg Haskell 无法识别制表符 '\t'。缩进/格式化时请使用空格而不是制表符。

    【讨论】:

      【解决方案4】:

      当我在保护表达式后使用制表符而不是空格时出现此错误('\t' 表示制表符):

      pow1 b e  
      | (e == 0)\t= 1  
      | otherwise = b * pow1 b (e-1)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-09-18
        • 2013-05-28
        • 2016-01-11
        • 1970-01-01
        • 2018-05-02
        相关资源
        最近更新 更多