以下功能只能使用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。它不再需要并返回一个列表,而是取一个整数并返回新修改的整数?感谢
答案 0 :(得分:4)
您不需要map
或filter
。如果您进入列表monad的领域,则无法逃脱(如果您只能使用filter
和map
)。以下是您可以学习的非常简单的实现:
apply :: Int -> (a -> a) -> a -> a
apply 0 _ = id
apply 1 f = f
apply n f = (apply (n - 1) f) . f
答案 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
看看你是否可以概括。
专业提示:
x
= apply 0 (fmap f f) x
和f x
= apply 0 (fmap f f) $ f x
f . g
输入良好,则为fmap f g = f . g
。不确定为什么需要地图/过滤器;或许改一下这个问题?