[英]Haskell: List Comprehensions and higher-order functions
我试图改变以下列表理解:
f xs = [ x+8 | (x,_) <- xs ]
使用高阶函数。
我的第一个解决方案是
f' xs = map (\(x,_) -> x+8) xs
在我尝试了各种其他方法后,我发现以下内容也有效:
f' xs = map((+8).fst) xs
两个版本的f'
给出相同(正确)的输出,但我不明白为什么(+8).fst
在元组列表上使用map
时等于\\(x,_) -> x+8
。
fst
的定义是
fst :: (a, b) -> a
fst (a, _) = a
(.)
的定义是
(.) :: (b -> c) -> (a -> b) -> a -> c
(f . g) = \x -> f (g x)
如果我们使用这些定义来扩展您的功能,我们就会得到
f' xs = map ((+8) . fst) xs
f' xs = map (\x -> (+8) (fst x)) xs -- definition of (.)
f' xs = map (\x -> (+8) ((\(a, _) -> a) x)) -- definition of fst
f' xs = map (\(a, _) -> (+8) a) -- we can move the pattern matching
f' xs = map (\(a, _) -> a + 8) -- expand section
两个版本的f'给出相同(正确)的输出,但我不明白为什么
(+8).fst
在元组列表上使用map时等于(x,_) -> x+8
。
fst
的类型是:
fst :: (a, b) -> a
它的作用是它需要一对中的第一个元素(两个元素的元组)。
(+8)
的类型是:
(+8) :: Num a => a -> a
它的作用是将Num
作为输入,对它应用+ 8
并返回结果。
现在,类型为(+8) . fst
(+8) . fst
是:
((+8).fst) :: Num c => (c, b) -> c
这是fst
和(+8)
。 具体来说,它是将一对作为输入的函数,提取第一个元素并向其添加8
。
通过以下示例可以很容易地看出这一点:
((+8).fst) (3, 'a')
-- 11
\\ (x, _) -> x + 8
也会发生同样的事情。 你把一对作为输入(在lambda中),模式匹配x
的第一个参数,将它递增8
并返回它:
(\ (x, _) -> x + 8) (3, 'a')
-- 11
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.