以下功能只能使用map
和/或filter
。没有fold/foldr
等功能应该有以下签名和类型:apply::n f x
它应该适用于f只有n times
。更正式地描述一下,它看起来像这样:apply n f x = f (f...(f x)...)
,其中f被应用n次。映射和/或过滤器仅返回单个元素而不是列表。 HASKELL
这对地图来说非常容易实现,但问题是地图会带来并返回一个列表。我希望它只取一个整数,通过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])
我怎么能修改此功能,第一它不再需要并返回一个列表,而是取一个整数并返回新的修改整数?谢谢
1.摆脱地图的;这将使类型'Int'; 2.考虑在你调用'apply'的行上,你只能确保'apply'被称为'n'次 - 'f'根本不被调用。但是,如果'apply(n-1)...'返回应用'f'' n-1'次的结果,你怎么能在'n'中应用'n'次呢? – 2014-10-21 22:41:48
你说你只能使用'map' /'filter',但不是你必须使用。为什么不写'apply n f x | n == 1 = f x | n> 1 = apply(n-1)f(f x)|否则= x'? – genisage 2014-10-21 22:42:46