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应用于x
n次
。更正式一点的描述,它看起来是这样的:
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
看看你能不能概括一下

专业提示:

  • 福尔f<代码>x=
    应用0(fmap f)x
    fx
    =
    应用0(fmap f)$fx
  • 如果
    f。g
    类型正确,然后
    fmap f g=f。g
  • 不确定为什么需要映射/过滤器;也许可以重新表述这个问题

    看看你能不能概括一下

    专业提示:

  • 福尔f<代码>x=
    应用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
    applicated
    n
    次超出这个范围呢?你说你只能使用
    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
    applicated
    n
    次超出这个范围呢?你说你只能使用
    map
    /
    过滤器
    ,但你不必使用这两种方法。为什么不直接写
    apply n f x | n==1=f x | n>1=apply(n-1)f(f x)|否则=x