为什么这两个函数的结果不相等?
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") -}
Run Code Online (Sandbox Code Playgroud)
这些函数的唯一区别是let中变量的名称.
最好的问候,Stefan
Dan*_*Dan 11
如果你打开-Wall,你会看到一个警告,t1暗示name现有的绑定name:
let no name = name
^^^^--- this one
Run Code Online (Sandbox Code Playgroud)
阴影
name = "Max Mustermann" :: String
Run Code Online (Sandbox Code Playgroud)
所以,name在函数内部的参数,使得功能一样id,而t2在name:
let no n = name
Run Code Online (Sandbox Code Playgroud)
是在顶层定义的那个.