Haskell - 输入"|"时的解析错误

Les*_*lex 9 haskell

pow1 b e  
| (e == 0)  = 1  
| otherwise = b * pow1 b (e-1)
Run Code Online (Sandbox Code Playgroud)

我在.hs文件中有完全相同的代码,加载时我总是得到相同的解析错误.我不认为它实际上包含任何错误 - 所以我目前的想法是"|" 标志不是哈斯克尔想要的,但它是我的Macbook键盘上的标准键盘(使用Mac OS).是否有可能,如果是这样,我该怎么回事呢?我正在使用TextEdit编写代码,并打开纯文本设置.

小智 15

一定要缩进守卫; Haskell有很大的空白.

pow1 b e
    | (e == 0)  = 1
    | otherwise = b * pow1 b (e-1)
Run Code Online (Sandbox Code Playgroud)

  • 并添加:缩进空格,*不*制表符.(例如,确保编辑器将制表符转换为空格.) (3认同)
  • Haskell有很大的空白,*除非*你想用括号编写你的代码 (2认同)

小智 5

您需要做的就是在警卫面前添加空格,代码将正常工作.

pow1 b e  
    | (e == 0)  = 1  
    | otherwise = b * pow1 b (e-1)
Run Code Online (Sandbox Code Playgroud)

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

说明:

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

您的代码不起作用,因为Haskell期望函数体在比函数定义更深的缩进级别上,以及在同一级别上的其他函数定义.将尝试将同一缩进级别上的任何新行解释为新的函数定义,不允许他们以警卫开始,|因此会得到解析错误.

Mac字符键和文本编辑器没有任何问题.

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