为什么不允许具有相同名称的参数在同一个等式中出现多次? 例子:
f a a = show a
d && d = d
_ && _ = False
从技术上讲,形式参数(报告称这些变量。)也是模式 - 只是它们永远不会匹配一个值。作为成功匹配的“副作用”,形式参数与其匹配的值绑定。因此,任何一个等式中的模式都不允许出现多次相同的形式参数(称为线性§3.17,§3.3,§4.4.3)。
答案 0 :(得分:13)
根据this mailing list post,这在米兰达是允许的,并且是一个常见的错误来源:人们会以同样的方式将两个变量命名为偶然并且难以发现这样一个微妙的错误。所以Haskell不允许它明确添加警卫。
我个人认为这对你的代码的不良读者来说也更加温和,因为这个规则的结果不需要记住模式匹配站点范围内的所有不同变量,看看是否模式实际上会匹配所有内容。
答案 1 :(得分:1)
您无法定义
d && d = d
_ && _ = False
因为你试图在变量上使用模式匹配。
模式匹配仅适用于数据构造函数,所以
True && True = True
没问题,但是
d && d = d
表示“接受第一个参数(让我们称之为d
)和第二个参数(让我们称之为d
)和......”但编译器会中断你说
“不,等等,不要同时打电话给他们d
,我不知道你指的是哪一个!”而且你说
“但我只想让你这样做,无论如何它们都是一样的”并且编译器说
“这不是名称的用途 - 用a == b
进行测试。请不要在不使用==
的情况下检查是否相等,除非你定义==
,否则我不知道你的平均意思通过使您的数据成为Eq
类型类的实例,在这种情况下,我希望您在类型签名中警告我,以便我可以获得编译的==
的正确定义。“< / p>
当你说f a a = show a
,然后问show 3 4
编译器说“你想让我展示哪一个?”