Haskell: Usage of flip results in error: Equations for ‘.>’ have different numbers of arguments
Haskell: Usage of flip results in error: Equations for ‘.>’ have different numbers of arguments
我很难理解这里发生了什么。
我想实现一个数据类型 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
来解决错误,但是 我不明白为什么翻转不起作用 。有什么想法吗?
编辑:删除了第二个不相关的问题
Haskell 要求函数的每个等式在左侧具有相同数量的显式参数。这是不允许的:
N .> S = ... -- two arguments
W .> E = ... -- two arguments
(.>) = ... -- no arguments
即使最后一行在道德上是正确的,因为 ...
部分的类型有两个参数, Haskell 不允许它,因为参数没有明确出现在左手边。因此,我们需要使用
之类的方式使参数明确
x .> y = ... x y -- two arguments
即:
x .> y = flip (.>) x y
可以简化为
x .> y = y .> x
这就是你在问题中所写的。
如果您想知道为什么不允许这样做,there is a question for that。
我很难理解这里发生了什么。
我想实现一个数据类型 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
来解决错误,但是 我不明白为什么翻转不起作用 。有什么想法吗?
编辑:删除了第二个不相关的问题
Haskell 要求函数的每个等式在左侧具有相同数量的显式参数。这是不允许的:
N .> S = ... -- two arguments
W .> E = ... -- two arguments
(.>) = ... -- no arguments
即使最后一行在道德上是正确的,因为 ...
部分的类型有两个参数, Haskell 不允许它,因为参数没有明确出现在左手边。因此,我们需要使用
x .> y = ... x y -- two arguments
即:
x .> y = flip (.>) x y
可以简化为
x .> y = y .> x
这就是你在问题中所写的。
如果您想知道为什么不允许这样做,there is a question for that。