Haskell:使用翻页会导致错误:“。>”的方程式具有不同数量的参数

时间:2019-12-08 13:53:19

标签: haskell commutativity

我正在努力了解这里发生的事情。 我想实现数据类型Direction并为其定义一个交换运算符.>。 到目前为止,我有这个:

data Direction = N | E | S | W | None

(.>) :: Direction -> Direction -> [Direction]
N .> S = [None]
W .> E = [None]
(.>) = flip (.>)

我收到错误Equations for ‘.>’ have different numbers of arguments。那是我不明白的原因,因为在ghci中检查时,方程的两边都具有相同数量的参数:

λ> :t (.>)
(.>) :: Direction -> Direction -> [Direction]
λ> :t flip (.>)
flip (.>) :: Direction -> Direction -> [Direction]

我可以通过编写d1 .> d2 = d2 .> d1而不是使用flip来解决错误,但是我不明白为什么翻转不起作用。有什么想法吗?

修改:删除了第二个无关的问题

1 个答案:

答案 0 :(得分:5)

Haskell要求函数的每个方程式的左侧必须具有相同数量的显式参数。这是不允许的:

QWidget w;
w.setStyleSheet("QWidget {background-color: rgb(201, 76, 76);}");

即使最后一行在道德上是正确的,由于N .> S = ... -- two arguments W .> E = ... -- two arguments (.>) = ... -- no arguments 部分的类型有两个自变量,Haskell也不允许它,因为自变量未明确出现在左侧。因此,我们需要使用类似

的方法使参数明确
...

也就是说:

x .> y = ... x y  -- two arguments

可以简化为

x .> y = flip (.>) x y

这是您在问题中所写的。

如果您想知道为什么不允许这样做,请there is a question for that