繁体   English   中英

Haskell:List Comprehensions和高阶函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM