PureScript中compare声明参数列表长度不一致错误原因咨询
问题分析:Ord实例定义中的参数列表不匹配错误
你定义的Line类型Ord实例代码如下:
import Prelude data Line = Front | Middle | Back derive instance eqLine :: Eq Line instance ordLine :: Ord Line where compare a b | a == b = EQ compare Front _ = LT compare Back _ = GT compare = flip compare
编译时出现错误:Argument list lengths differ in declaration compare,但将最后一行改为compare a b = flip compare a b后即可正常编译,且flip compare的类型确实是forall (t4 :: Type). Ord t4 => t4 -> t4 -> Ordering,符合compare的签名。
报错原因
在PureScript(以及同类型函数式语言)的实例定义中,同一个函数的所有定义分支必须保持参数列表形式一致:
- 前面三个
compare分支都是显式写出两个参数的模式匹配写法(比如a b、Front _); - 最后一行的
compare = flip compare是直接将函数值绑定到compare,没有显式声明参数,属于无参数的函数绑定写法。
编译器会判定这种混合写法为参数列表长度不一致——它无法统一解析同一个函数的不同定义形式。当你把最后一行改成显式带参数的compare a b = flip compare a b后,所有分支都采用了带参数的写法,编译器就能正确识别这是同一个函数的完整定义,从而通过编译。
内容的提问来源于stack exchange,提问作者Robb
相关产品推荐
相关产品推荐

