Haskell:列表推导式和高阶函数

标签 haskell 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 等于 \(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/

相关文章:

compiler-errors - 可扩展记录和高阶函数

haskell - 堆栈项目中缺少 ghc-mod 包

struct - GLSL 中的二阶函数?

haskell - 我们怎么知道应用程序不能是 Monad?

haskell - Writer Monad 是否保证右关联连接?

javascript - 使用 Redux 理解 HOC

javascript - Javascript 中的高阶函数

swift - 为什么我的过滤器版本与 Swifts 的表现如此不同?

haskell - 为什么这段代码会因 Int -> Int 而溢出?

haskell - 在 Haskell 中使用相同的输入连接两个 IO 操作