我尝试转换以下列表理解:
f xs = [ x+8 | (x,_) <- xs ]
使用高阶函数。
我的第一个解决方案是:
f' xs = map (\(x,_) -> x+8) xs
在尝试了各种其他方法后,我发现以下方法也有效:
f' xs = map((+8).fst) xs
两个版本的 f'
给出相同(正确)的输出,但我不明白为什么 (+8).fst
等于 \(x,_) -> x+8
在元组列表上使用 map
时。
最佳答案
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
关于Haskell:列表推导式和高阶函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23208029/