声明foo中的模式中的解析错误(5 + 5:x:xs)= x

时间:2018-05-14 05:04:14

标签: haskell pattern-matching

如果我用10替换5 + 5,代码将按预期工作。这里有什么问题?我可以在模式中使用+运算符吗?它被认为是n + k模式吗?我知道Haskell 2010上不允许这些,所以这可能是问题所在。

感谢。

2 个答案:

答案 0 :(得分:4)

是的,这是真的。通常,Haskell中的有效模式应该只包含您绑定的构造函数,文字和变量,而不仅仅包含任何函数。 (Haskell/Pattern matching

(+)是一个函数,因此包含它的模式不应该是有效的。所谓的" n + k模式"事实上,它是作为一种语法糖引入的(参见Wikipedia's entry on Haskell 2010)。除此之外,作为模式的(5+5:x:xs)应与[x, y, z] ++ xs一样无效。

为了得到我自己的两分钱,这可能是为什么它不被允许的另一个原因,即使有两个文字是(+)的操作数。如果5+5模式要通过编译器,Haskell允许您执行此操作:

foo x = let 5 + 5 = 11 in (\(5+5:xs) -> x ++ xs)

现在在编译时就明白了5 + 5 = 10

答案 1 :(得分:1)

根据https://www.haskell.org/definition/haskell98-report.pdf中的3.17.1,模式语法只允许var + integer,因此5+5也不应该是Haskell 98中的合法模式。