map和/或filter只返回单个元素而不是list。 HASKELL

时间:2014-10-21 22:33:33

标签: haskell higher-order-functions

以下功能只能使用map和/或filter。否fold/foldr等。该函数应具有以下签名和类型:apply::n f x并且它应该仅将f应用于x n times。更正式地描述,它看起来像这样:apply n f x = f (f...(f x)...),其中f被应用n次。

这很容易通过map实现,但问题是map会获取并返回一个列表。我希望它只取一个整数,用f转换它然后返回那个新的整数。

到目前为止,我写道:(通过获取并返回列表来工作)

apply::Int->(Int->Int)->[Int]->[Int]
apply n f x
 | n==1         =map f x
 | n>1          =apply (n-1) f (map f x)
 | otherwise    =x

这就是我所说的:

main = do
print(apply 2 (*2) [3])

如何修改此函数,s。它不再需要并返回一个列表,而是取一个整数并返回新修改的整数?感谢

2 个答案:

答案 0 :(得分:4)

您不需要mapfilter。如果您进入列表monad的领域,则无法逃脱(如果您只能使用filtermap)。以下是您可以学习的非常简单的实现:

apply :: Int -> (a -> a) -> a -> a
apply 0 _ = id
apply 1 f = f
apply n f = (apply (n - 1) f) . f

Live demo

答案 1 :(得分:0)

apply 0 _ x =                        x
apply 1 f x =                      f x
apply 2 f x = apply 1 (fmap f f)     x
apply 3 f x = apply 1 (fmap f f) $ f x
apply 4 f x = apply 2 (fmap f f)     x
apply 5 f x = apply 2 (fmap f f) $ f x

看看你是否可以概括。

专业提示:

  1. forall f。 x = apply 0 (fmap f f) xf x = apply 0 (fmap f f) $ f x
  2. 如果f . g输入良好,则为fmap f g = f . g
  3. 不确定为什么需要地图/过滤器;或许改一下这个问题?