让我的行为奇怪

时间:2013-03-01 09:20:38

标签: haskell let

我有以下程序:

mnr = [0,1,2,3,4,5,6]  :: [Int]
name = "Max Mustermann" :: String
kzn = "e53X" :: String

t1 = ("p1",(take 2.tail)mnr, (take 3.words.(let no n= name;in no))"No");
{-result: t1 == ("p1",[1,2],["Max","Mustermann"]) -}

为什么"否"忽略了let no n= name;in no做了什么?

1 个答案:

答案 0 :(得分:12)

这是非常疯狂编写的代码。让我们一点一点地解决它。

首先,t1(a,b,c)类型的元组。让我们写t1 = (x,y,z)并尝试解决问题。很明显,aStringx"p1"

第二个组件是((take 2) . tail) mnrtake 2 [1,2,3,4,5,6],即[1,2]。因此b[Int]y[1,2]。有道理。

第三个组成部分是奇怪的。首先,

let no n = name in no

只是定义一个函数\n -> name,即返回name的常量函数。这更好地写成const name。因此,您拥有了(take 3) . words . (const name),并将其应用于"No"。好吧,(const name) "No"显然只是name,即"Max Mustermann"。因此words适用于此["Max", "Mustermann"],然后take 3会获得前三个元素,即["Max", "Mustermann"]。这是z以上,并显示c[String]

总而言之,您的t1类型为(String, [Int], [String]),价值为("p1", [1,2], ["Max", "Mustermann"])


应该清理第三个组件的代码,但是如何清理它取决于你真正想要做什么。然而,就目前而言,它非常复杂,只会让你和其他人感到困惑。