为什么不允许在同一等式中出现相同名称的参数?
示例:
f a a = show a
d && d = d
_ && _ = False
从技术上讲,形式参数(报告称之为变量)也是模式,只不过它们永远不会匹配失败。作为成功匹配的“副作用”,形式参数被绑定到它正在匹配的值上。因此,在任何一个方程中,模式不允许有多个相同形式参数的出现(这被称为线性特性 §3.17、§3.3、§4.4.3)。
为什么不允许在同一等式中出现相同名称的参数?
示例:
f a a = show a
d && d = d
_ && _ = False
从技术上讲,形式参数(报告称之为变量)也是模式,只不过它们永远不会匹配失败。作为成功匹配的“副作用”,形式参数被绑定到它正在匹配的值上。因此,在任何一个方程中,模式不允许有多个相同形式参数的出现(这被称为线性特性 §3.17、§3.3、§4.4.3)。
/(\w+) \1/
,它匹配由空格分隔的相同单词)。也许如果Haskell本身有一个反向引用字符,就像f x \x = ....
,那么它可能会更少出错。 - jamshidhfoo (Person name age id) (Person name' age' id') (Company name location ceo)
或类似的东西,那么阅读此代码的人会感到疲劳,以便解密哪些变量匹配所有值,哪些是“特殊”的 - 例如,您是否注意到此模式仅在您恰好传递具有相同名称的人和公司时才匹配? - Daniel WagnermySuperDuperConstant
在作用域内时,我也可以使用隐含的等式来匹配它。比如,mySuperDuperConstant = 42; foo mySuperDuperConstant = 0; foo _ = 1
应该将 42
映射为 0
,将其他所有内容映射为 1
。” 突然间,问题变得十倍复杂:你不仅需要检查同一模式中的其他变量,还需要检查每个作用域内的变量。我认为,长参数列表与长全局常量列表并没有太大的区别。 - Daniel Wagnerd && d = d
_ && _ = False
True && True = True
是可以的,但
d && d = d
d
)和第二个参数(我们称之为d
)然后……”,但编译器打断你说:“不,等一下,不要都叫d
,我不知道你指的是哪个!”然后你说:“但如果它们相同,我只想让你这样做” ,编译器说:“那不是名称的作用 - 用a == b
进行测试。请不要在没有使用==
的情况下检查相等性,除非通过将数据实例化为Eq
类型类来定义==
,在这种情况下,我希望你在类型签名中警告我,以便我可以获得正确的==
编译定义。”f a a = show a
,然后要求它show 3 4
,编译器会说“你想让我显示哪一个?”
f
:f 1 2
,结果应该是什么? - Pedro Rodriguesx
或y
没有Eq
实例,或者它们是不同的类型,则意味着与f x y | x == y = ....
完全相同的含义- 编译器错误。 - jamshidh