我有以下程序:
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
做了什么?
答案 0 :(得分:12)
这是非常疯狂编写的代码。让我们一点一点地解决它。
首先,t1
是(a,b,c)
类型的元组。让我们写t1 = (x,y,z)
并尝试解决问题。很明显,a
为String
,x
为"p1"
。
第二个组件是((take 2) . tail) mnr
,take 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"])
。
应该清理第三个组件的代码,但是如何清理它取决于你真正想要做什么。然而,就目前而言,它非常复杂,只会让你和其他人感到困惑。