摘要:这是来自Miranda考试的过去的考题,但其语法与Haskell非常相似。Haskell/Miranda:查找函数的类型
问题:下列表达式的类型是什么?它有什么作用? (函数长度和交换的定义 在下面给出)。
(foldr (+) 0) . (foldr ((:) . length . (swap (:) [])) [])
length [] = 0
length (x:xs) = 1 + length xs
swap f x y = f y x
注:
请随时在Haskell语法答复 - 抱歉使用星星一样多型推杆,但我不希望它错误地翻译成哈斯克尔。基本上,如果一个变量具有*类型而另一个具有*则意味着它们可以是任何类型,但它们必须是相同的类型。如果有**,则表示它可以但不需要具有与*相同的类型。我认为它对应于haskell usuage中的a,b,c等。
我至今
从长度的定义工作,你可以看到它发现的任何一个列表的长度,这给
length :: [*] -> num.
从定义我想交换发生在一个函数和两个参数并产生交换两个参数的函数,所以这给出了
swap :: (* -> ** -> ***) -> ** -> [*] -> ***
foldr采用二进制函数(如加号)起始值和列表,并使用该函数从右向左折叠列表。这给
foldr :: (* -> ** -> **) -> ** -> [*] -> **)
我知道在函数组合是右结合的如此例如一切到第一点(。)的权利需要产生一个列表,因为它会被作为参数给出的第一foldr相似。
foldr函数输出一个值(折叠列表的结果),所以我知道返回类型将是某种多类型而不是多类型列表。
我的问题
我不确定从这里到真的去。我可以看到交换需要接受另一个论证,这个部分应用意味着整个事情是一个函数吗?我很困惑!
只需安装[哈斯克尔平台(http://hackage.haskell.org/platform/),并使用GHCI进行测试,有什么问题? 'Prelude> let swap = flip''Prelude>:t(foldr(+)0)。 (foldr((:) :) length。(swap(:) []))[])' '(foldr(+)0)。 (foldr((:) :) length。(swap(:) []))[]) :: [a] - > Int'。 – leftaroundabout
感谢您的答案,但我希望得到一些帮助,了解如何到达那里!虽然知道答案肯定会帮助我尝试找出那里的路线,所以再次感谢 – user1058210
那么,您可以测试GHCi中完整路线的任何子表达式,这应该很好地让您了解到达路线的方式。 – leftaroundabout