作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
简介:这是来自 Miranda 考试的过去考试问题,但语法与 Haskell 非常相似。
问题:以下表达式的类型是什么,它有什么作用? (定义
函数长度和交换如下所示)。
(foldr (+) 0) . (foldr ((:) . length . (swap (:) [] )) [])
length [] = 0
length (x:xs) = 1 + length xs
swap f x y = f y x
length :: [*] -> num.
swap :: (* -> ** -> ***) -> ** -> [*] -> ***
foldr :: (* -> ** -> **) -> ** -> [*] -> **)
最佳答案
你已经有了答案,我就一步步写下推导,方便一下子看出来:
xxf xs = foldr (+) 0 . foldr ((:) . length . flip (:) []) [] $ xs
= sum $ foldr ((:) . length . (: [])) [] xs
= sum $ foldr (\x -> (:) (length [x])) [] xs
= sum $ foldr (\x r -> length [x]:r) [] xs
= sum $ map (\x -> length [x] ) xs
= sum [length [x] | x <- xs]
= sum [ 1 | x <- xs]
-- = length xs
xxf :: (Num n) => [a] -> n
xxf xs = #xs
.我猜它的类型是
:: [*] -> num
在米兰达语法。
length
是
:: [a] -> Int
, 但正如这里定义的那样,它是
:: (Num n) => [a] -> n
因为它使用
Num
的
(+)
和两个文字,
0
和
1
.
foldr
时遇到问题, 很简单
foldr (+) 0 (a:(b:(c:(d:(e:(...:(z:[])...))))))
= a+(b+(c+(d+(e+(...+(z+ 0)...)))))
= sum [a, b, c, d, e, ..., z]
关于 haskell /米兰达 : Find the type of the function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10373754/
简介:这是来自 Miranda 考试的过去考试问题,但语法与 Haskell 非常相似。 问题:以下表达式的类型是什么,它有什么作用? (定义 函数长度和交换如下所示)。 (foldr (+) 0)
我是一名优秀的程序员,十分优秀!