解析错误(可能是错误的缩进或括号不匹配) - Haskell

Dav*_*vid 1 haskell

这很愚蠢,但我甚至无法解决空格和制表符的问题.有时我认为问题不在我身上,而是在Haskell中.为什么Python没有相同的问题?

我的代码是:

lookups :: (Eq a) => a -> [(a,b)] -> [b]
lookups x ys = do y <- ys
                  if fst y == x then return (snd y)
Run Code Online (Sandbox Code Playgroud)

我有一个错误:parse error (possibly incorrect indentation or mismatched brackets).我的代码只使用空格.

bhe*_*ilr 6

你需要一个else在你的if-then.所有if在Haskell小号必须thenelse,否则表达就不会总是返回一个值.在Haskell中,所有表达式都必须返回一个值,所以if-then没有a else不是表达式,因此解析错误.如果出现以下情况,您需要决定做什么fst y /= x:

lookups x ys = do y <- ys
                  if fst y == x
                    then return (snd y)
                    else ???
Run Code Online (Sandbox Code Playgroud)

  • @David如果你是来自Java或Python之类的另一种语言,那么它就不是很直观,但如果你有`int func(int x){if(x == 1),你仍会在Java中出错){返回2; 因为并非所有的代码路径都返回一个`int`(我认为我的语法是正确的,我几年没有写过Java代码).在Haskell中,它只是在没有`else`的情况下解析而不是抛出相当于类型错误的内容. (3认同)