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



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

谢谢。

是的,这是真的。通常,Haskell中的有效模式应该只包含绑定到的构造函数,文字和变量,而不仅仅是任何函数。(哈斯克尔/模式匹配(

(+)是一个函数,因此包含它的模式根本不应该是有效的。所谓的"n+k模式"之所以是一个东西,是因为它被引入为一种句法糖(参见维基百科关于Haskell2010的条目(。除此之外,(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

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

最新更新