Haskell let-in Construct

时间:2014-03-06 13:39:04

标签: haskell

为什么这两个函数的结果不相等?

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中变量的名称。

祝你好运, 斯蒂芬

1 个答案:

答案 0 :(得分:11)

如果您启用-Wall,您会在t1中看到name隐藏name现有绑定的警告:

let no name = name
       ^^^^--- this one

阴影

name = "Max Mustermann" :: String

因此函数内的name是参数,使函数与id相同,而在t2name

let no n = name

是在顶级定义的那个。