【发布时间】:2012-05-09 13:35:53
【问题描述】:
简介:这是 Miranda 考试的过去试题,但语法与 Haskell 非常相似。
问题:以下表达式的类型是什么,它的作用是什么? (定义 函数长度和交换如下所示)。
(foldr (+) 0) . (foldr ((:) . length . (swap (:) [] )) [])
length [] = 0
length (x:xs) = 1 + length xs
swap f x y = f y x
注意:
请随时用 haskell 语法回复 - 很抱歉将星星用作多型,但我不想将它错误地翻译成 haskell。基本上,如果一个变量具有 * 类型,而另一个具有 * 则意味着它们可以是任何类型,但它们必须是相同的类型。如果一个有**,则意味着它可以但不需要与*具有相同的类型。我认为它对应于 haskell 用法中的 a、b、c 等。
我目前的工作
从长度的定义你可以看到它找到了任何东西的列表的长度,所以这给出了
length :: [*] -> num.
从定义我认为 swap 接受一个函数和两个参数,并产生两个参数交换的函数,所以这给出了
swap :: (* -> ** -> ***) -> ** -> [*] -> ***
foldr 接受一个二进制函数(如加号)一个起始值和列表,并使用该函数从右到左折叠列表。这给了
foldr :: (* -> ** -> **) -> ** -> [*] -> **)
我知道在函数组合中它是右关联的,因此例如第一个点 (.) 右侧的所有内容都需要生成一个列表,因为它将作为第一个 foldr 的参数给出。
foldr 函数输出单个值(折叠列表的结果),所以我知道返回类型将是某种多型,而不是多型列表。
我的问题
我真的不确定从这里去哪里。我可以看到 swap 需要接受另一个参数,那么这个部分应用是否暗示整个事物是一个函数?我很困惑!
【问题讨论】:
-
安装Haskell Platform,用GHCi测试一下,有什么问题?
Prelude> let swap = flipPrelude> :t (foldr (+) 0) . (foldr ((:) . length . (swap (:) [] )) [])(foldr (+) 0) . (foldr ((:) . length . (swap (:) [] )) []) :: [a] -> Int. -
感谢您的回答,但我也希望能在了解如何到达那里得到一些帮助!虽然知道答案肯定会帮助我尝试找出那里的路线,但再次感谢
-
嗯,您可以在 GHCi 中测试完整子表达式的任何子表达式,这应该可以让您了解到达那里的方法。
标签: haskell types functional-programming type-inference miranda