Haskell let-in Construct

use*_*688 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") -}
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,而t2name:

let no n = name
Run Code Online (Sandbox Code Playgroud)

是在顶层定义的那个.

  • 总是使用`-Wall`的另一个原因! (4认同)