Haskell 映射和/或筛选以仅返回单个元素而不是列表。哈斯克尔
以下功能只能使用Haskell 映射和/或筛选以仅返回单个元素而不是列表。哈斯克尔,haskell,higher-order-functions,Haskell,Higher Order Functions,以下功能只能使用map和/或filter。无fold/foldr等。该函数应具有以下签名和类型:apply::n f x且应仅将f应用于xn次。更正式一点的描述,它看起来是这样的:applynfx=f(f…(fx)…),其中f被应用n次 使用map很容易做到这一点,但问题是map将获取并返回一个列表。我希望它只取一个整数,用f变换,然后返回新的整数 到目前为止,我写了以下内容:(通过获取并返回列表来工作) 我这样称呼它: main = do print(apply 2 (*2) [3]) 我如
map
和/或filter
。无fold/foldr
等。该函数应具有以下签名和类型:apply::n f x
且应仅将f应用于xn次
。更正式一点的描述,它看起来是这样的:applynfx=f(f…(fx)…)
,其中f被应用n次
使用map很容易做到这一点,但问题是map将获取并返回一个列表。我希望它只取一个整数,用f变换,然后返回新的整数
到目前为止,我写了以下内容:(通过获取并返回列表来工作)
我这样称呼它:
main = do
print(apply 2 (*2) [3])
我如何修改这个函数,s.t它不再接受并返回一个列表,而是接受一个整数并返回新修改的整数?谢谢
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
看看你能不能概括一下
专业提示:
应用0(fmap f)x
和fx
=应用0(fmap f)$fx
f。g
类型正确,然后fmap f g=f。g
应用0(fmap f)x
和fx
=应用0(fmap f)$fx
f。g
类型正确,然后fmap f g=f。g
不确定为什么需要映射/过滤器;也许可以重新表述这个问题?您不需要
map
或filter
。如果您进入列表monad的领域,则没有转义(如果您只能使用过滤器
和映射
)。下面是一个非常简单的实现,您可以研究它:
apply :: Int -> (a -> a) -> a -> a
apply 0 _ = id
apply 1 f = f
apply n f = (apply (n - 1) f) . f
您不需要
映射
或过滤器
。如果您进入列表monad的领域,则没有转义(如果您只能使用过滤器
和映射
)。下面是一个非常简单的实现,您可以研究它:
apply :: Int -> (a -> a) -> a -> a
apply 0 _ = id
apply 1 f = f
apply n f = (apply (n - 1) f) . f
1。去掉地图;这将使类型
Int
;2.考虑到在调用“代码>应用< <代码>的行中,您只确定<代码>应用被称为<代码> N< /代码> Time- <代码> f>代码>根本不被调用。但是如果apply(n-1)…
返回应用f
n-1
次的结果,你怎么能让f
applicatedn
次超出这个范围呢?你说你只能使用map
/过滤器
,但你不必使用这两种方法。为什么不直接写下应用n f x | n==1=f x | n>1=apply(n-1)f(f x)|否则=x。去掉地图;这将使类型Int
;2.考虑到在调用“代码>应用< <代码>的行中,您只确定<代码>应用被称为<代码> N< /代码> Time- <代码> f>代码>根本不被调用。但是如果apply(n-1)…
返回应用f
n-1
次的结果,你怎么能让f
applicatedn
次超出这个范围呢?你说你只能使用map
/过滤器
,但你不必使用这两种方法。为什么不直接写apply n f x | n==1=f x | n>1=apply(n-1)f(f x)|否则=x
?