为什么这两个函数的结果不相等?
mnr = [0,1,2,3,4,5,6] :: [Int]
name = "Max Mustermann" :: String
t1 = ("p1",(length.take 2)mnr, (take 2.(let no name = name;in no))"No");
{- ("p1",2,"No") -}
t1' = ("p1",(length.take 2)mnr, (take 2.(let no n = name;in no))"No");
{- ("p1",2,"Ma") -}
这些函数的唯一区别是let中变量的名称。
祝你好运, 斯蒂芬
答案 0 :(得分:11)
如果您启用-Wall
,您会在t1
中看到name
隐藏name
现有绑定的警告:
let no name = name
^^^^--- this one
阴影
name = "Max Mustermann" :: String
因此函数内的name
是参数,使函数与id
相同,而在t2
中name
:
let no n = name
是在顶级定义的那个。