pow1 b e
| (e == 0) = 1
| otherwise = b * pow1 b (e-1)
我在 .hs 文件中有确切的代码,加载时我总是得到相同的解析错误。我不认为它实际上包含任何错误 - 所以我目前的想法是“|” 符号不是 haskell 想要的,但它是我的 Macbook 键盘(使用 Mac OS)上的标准。有可能吗,如果可以,我该如何解决?我目前正在使用 TextEdit 编写代码,并启用纯文本设置。
pow1 b e
| (e == 0) = 1
| otherwise = b * pow1 b (e-1)
我在 .hs 文件中有确切的代码,加载时我总是得到相同的解析错误。我不认为它实际上包含任何错误 - 所以我目前的想法是“|” 符号不是 haskell 想要的,但它是我的 Macbook 键盘(使用 Mac OS)上的标准。有可能吗,如果可以,我该如何解决?我目前正在使用 TextEdit 编写代码,并启用纯文本设置。
一定要缩进警卫;Haskell 有很大的空白。
pow1 b e
| (e == 0) = 1
| otherwise = b * pow1 b (e-1)
您需要做的就是在警卫前面添加空格,代码就可以正常工作。
pow1 b e
| (e == 0) = 1
| otherwise = b * pow1 b (e-1)
(user142019 已经说明了这个解决方案,但是我觉得需要解释一下才能理解这个解决方案)
解释:
Haskell 使用空格缩进来控制其代码的结构和范围。其他编程语言(例如 Java)依靠花括号来做到这一点,Haskell 有缩进。
您的代码不起作用,因为 Haskell 期望函数体的缩进级别比函数定义和同一级别的其他函数定义更深。同一缩进级别上的任何新行都将被尝试解释为新的函数定义,不允许以警卫开头,|
因此会出现解析错误。
Mac 字符键和文本编辑器都没有问题。
关于缩进的主题:制表符不起作用。因此,您必须手动输入空格或更改编辑器的制表符设置以插入 4 个空格(我建议)而不是制表符。(例如,Notepad++ 允许这样做,这是我与 Haskell 一起使用的首选)。
除了记住缩进,在我第一次启动 Haskell的网站上看到这句话:
请注意,在函数名称及其参数之后,第一个保护之前没有 =。许多新手会遇到语法错误,因为他们有时会把它放在那里。
这也很重要。
@Greg Haskell 无法识别制表符'\t'
。缩进/格式化时请使用空格而不是制表符。
当我在保护表达式后使用制表符而不是空格时出现此错误('\t' 表示制表符):
pow1 b e
| (e == 0)\t= 1
| otherwise = b * pow1 b (e-1)