在 Haskell 中的函数列表中折叠
Foldl on a list of functions in Haskell
我正在尝试编写一个函数 pipe
,它采用数学函数列表,其中 pipe [f1,...,fn] x
应该 return f1(f2(...(fn x)))
我已将其设置为:
pipe :: [(a -> a)] -> (a -> a)
pipe fs = foldLeft f base fs
where
f a x =
base =
-- >>> pipe [] 3
-- 3
--
-- >>> pipe [(\x -> x+x), (\x -> x + 3)] 3
-- 12
--
-- >>> pipe [(\x -> x * 4), (\x -> x + x)] 3
-- 24
使用 foldl 解决此问题的最佳方法是什么?
谢谢!
使用 foldl 应该是:
pipe :: [(a -> a)] -> (a -> a)
pipe fs = foldl (\rs f -> f . rs) id fs
或使用 eta:
pipe :: [(a -> a)] -> (a -> a)
pipe = foldl (\rs f -> f . rs) id
与另一个埃塔:
pipe :: [(a -> a)] -> (a -> a)
pipe = foldl (.) id
以你为例:
pipe [(\x -> x * 4), (\x -> x + x)] 3
=> 24
pipe
实际上可以比你想象的简单得多,而且没有必要使用相当低效的 foldl
(你甚至可以在你自己的括号中看到这一点——它们是右结合):只是 flip (foldr id)
。到达那里的步骤:
pipe [f1,...,fn] x
f1 (f2 (... (fn x))) -- your definition of pipe
id f1 (id f2 (... (id fn x))) -- id x = x
foldr id x [f1,...,fn] -- the definition of foldr
我正在尝试编写一个函数 pipe
,它采用数学函数列表,其中 pipe [f1,...,fn] x
应该 return f1(f2(...(fn x)))
我已将其设置为:
pipe :: [(a -> a)] -> (a -> a)
pipe fs = foldLeft f base fs
where
f a x =
base =
-- >>> pipe [] 3
-- 3
--
-- >>> pipe [(\x -> x+x), (\x -> x + 3)] 3
-- 12
--
-- >>> pipe [(\x -> x * 4), (\x -> x + x)] 3
-- 24
使用 foldl 解决此问题的最佳方法是什么? 谢谢!
使用 foldl 应该是:
pipe :: [(a -> a)] -> (a -> a)
pipe fs = foldl (\rs f -> f . rs) id fs
或使用 eta:
pipe :: [(a -> a)] -> (a -> a)
pipe = foldl (\rs f -> f . rs) id
与另一个埃塔:
pipe :: [(a -> a)] -> (a -> a)
pipe = foldl (.) id
以你为例:
pipe [(\x -> x * 4), (\x -> x + x)] 3
=> 24
pipe
实际上可以比你想象的简单得多,而且没有必要使用相当低效的 foldl
(你甚至可以在你自己的括号中看到这一点——它们是右结合):只是 flip (foldr id)
。到达那里的步骤:
pipe [f1,...,fn] x
f1 (f2 (... (fn x))) -- your definition of pipe
id f1 (id f2 (... (id fn x))) -- id x = x
foldr id x [f1,...,fn] -- the definition of foldr