Parsing 哈斯克尔';s Lambda案没有';未按预期在序曲中工作,分析错误

Parsing 哈斯克尔';s Lambda案没有';未按预期在序曲中工作,分析错误,parsing,haskell,lambda,Parsing,Haskell,Lambda,下面是函数的定义(一个新的求和函数) 前奏曲>:set+m 前奏曲>:设置-XLambdaCase 前奏曲>让sum2=\case 前奏曲|[]->0 前奏曲| x:xs->x+sumw-xs 前奏曲 :31:5: 分析错误(可能缩进不正确或括号不匹配) 为什么它不起作用?有两个问题 由于let是块先驱,因此let之后的下一个标记(在本例中,即sum2)设置块的缩进级别。由于您将[]和x:xs模式放置在与sum2相同的缩进级别,因此它们是let块的一部分,而您可能希望它们成为\case块的一部

下面是函数的定义(一个新的求和函数)

前奏曲>:set+m
前奏曲>:设置-XLambdaCase
前奏曲>让sum2=\case
前奏曲|[]->0
前奏曲| x:xs->x+sumw-xs
前奏曲
:31:5:
分析错误(可能缩进不正确或括号不匹配)

为什么它不起作用?

有两个问题

  • 由于
    let
    是块先驱,因此
    let
    之后的下一个标记(在本例中,即
    sum2
    )设置块的缩进级别。由于您将
    []
    x:xs
    模式放置在与
    sum2
    相同的缩进级别,因此它们是
    let
    块的一部分,而您可能希望它们成为
    \case
    块的一部分。简单的解决方案是将两个模式缩进至少一个字符

  • 因为您对空格过敏,所以无意中尝试定义名为
    (=\)
    的运算符。添加一个空格,以明确您正试图定义的是
    sum2

  • 一起,你会得到:

    Prelude> let sum2= \case
    Prelude|      []->0
    Prelude|      x:xs->x+sumw xs
    Prelude|
    Prelude>
    

    仍然失败::28:12:parse error on input`case'@viksantata检查您是否确实启用了
    LambdaCase
    扩展,正如您在问题中所做的那样。啊,仍然存在缩进问题:我需要额外的空间在sum2之后生成[]。非常感谢。
    Prelude> let sum2= \case
    Prelude|      []->0
    Prelude|      x:xs->x+sumw xs
    Prelude|
    Prelude>