Haskell缩进问题

5

我正在使用Visual Studio Code作为首选的文本编辑器,但是下面的Haskell代码无法编译。显然是由于缩进或括号缺失的错误导致的。由于没有括号,我想知道问题出在哪里。

safeSqrt :: Either String Doubble -> Either String | Doubble
safeSqrt sx =
     case sx of
         Left str -> Left str
         Right x -> if x < 0
             then Left "Error"
             else Right $ sqrt x

GHCi会抛出以下错误信息:

Main.hs:51:1: error:
    parse error (possibly incorrect indentation or mismatched brackets)
   |
51 | safeSqrt sx =    
   | ^

有人可以帮忙吗?

谢谢

汤姆


4
类型应该是 Either String Double,中间不要用 | 管道符。 - Willem Van Onsem
1个回答

7
问题不在于缩进,而是类型签名的问题。您在Either的签名中使用了管道字符(|)。您应该将其删除。此外,您拼写错误了Doubble。虽然具有双倍b的double很好,但它不幸地不是Double的名称。
safeSqrt :: Either String <b>Double</b> -> <b>Either String Double</b>
safeSqrt sx =
     case sx of
         Left str -> Left str
         Right x -> if x < 0
             then Left "Error"
             else Right $ sqrt x

有趣的是,解析器对于 | 的处理方式是什么呢?毕竟它本身并不是导致问题的字符。 - chepner
1
@chepner:我也不确定。这可能与函数依赖性有关,因为它是具有函数依赖性类的“签名” 的一部分。但这只是一个猜测。 - Willem Van Onsem
是的,相同的语法规则可能适用于类型定义和类型注释,尽管在注释中 | 没有任何意义(据我所知)。 - chepner
3
我猜这看起来像是 x | condition1 = value1 | condition2 = value2 的一种变体,只是我们在 x 上有一个类型签名,例如 (x :: Int) | condition = ...。OP使用的缩进会在错误的位置添加分号,就像 (x :: Int) | condition ; x = ... - chi
谢谢Willem,现在已经编译成功了... :-] - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接