2014-03-06 31 views
1

为什么这两个函数的结果不相等?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中变量的名称。

最好的问候, 斯特凡

回答

11

如果打开-Wall,你会看到一个警告在t1name阴影现有的name结合:

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

阴影

name = "Max Mustermann" :: String 

所以这个函数里面的name就是这个参数功能一样id,而在t2name

let no n = name 

是在顶层中定义的一个。

+4

总是使用'​​-Wall'的另一个原因! –

+0

感谢您的快速回答 – user2925688