代码之家  ›  专栏  ›  技术社区  ›  kes

库函数与自身构成函数n次

  •  34
  • kes  · 技术社区  · 15 年前

    Haskell中是否有一个库函数可以用它自己组成一个函数 时代?

    例如,我有这个功能:

    func :: a -> a
    

    我想这样做:

    func . func . func . func . func . func , ... 
    

    n个 时代,哪里 n个

    注意,迭代函数不适合我所做的工作,因为我不关心任何中间结果。

    9 回复  |  直到 15 年前
        1
  •  56
  •   Reid Barton    15 年前

    这个 iterate n 副本 f foldr (.) id (replicate n f)

        2
  •  24
  •   Janus Troelsen    6 年前
    \xs n -> iterate func xs !! n
    

    ( xs n 是申请的次数 func

    我不知道为什么,但我觉得 iterate

    如果你不喜欢 !! 那你就可以用 zip lookup

    lookup n . zip [0..] . iterate func
    

    编辑:好的,所以我删除了然后取消删除,因为我同意另一个答案-你不应该仅仅因为它给你提供了 更多

        3
  •  13
  •   Tsuyoshi Ito    15 年前

    我不知道你为什么这么说 iterate 不合适。它完全适合这个目的。 (!! n) . iterate func n 副本 func

    (有人发布了与上述代码类似的答案,但他/她似乎已将其删除。)

        4
  •  12
  •   Thomas Eding    15 年前

    (\n -> appEndo . mconcat . replicate n . Endo) n f x

        5
  •  8
  •   Tyler    14 年前

    我是Haskell的初学者,目前正在学习 Learn You a Haskell For Great Good! 所以我还不熟悉前面回复中显示的功能。根据我目前的理解,我会这样做:

    applyNTimes :: Int -> (a -> a) -> a -> a
    applyNTimes n f x 
        | n == 0        = x
        | otherwise     = f (applyNTimes (n-1) f x)
    
        6
  •  3
  •   klapaucius    14 年前
    \n -> appEndo . foldMap Endo . replicate n
    
        7
  •  3
  •   Challenger5    7 年前

    下面是一个复杂度为O(log n)而不是O(n)的版本(用于构建函数,而不是应用它):

    composeN 0 f = id
    composeN n f
        | even n = g
        | odd  n = f . g
        where g = g' . g'
              g' = composeN (n `div` 2) f
    
        8
  •  2
  •   Community Mohan Dere    9 年前

    变化 trinithis' answer 使用 newtype 包装,只是为了好玩:

    (\n f -> under Endo (mconcat . replicate n) f)
    

    under Endo . (mconcat .) . replicate
    
        9
  •  1
  •   Zark Bardoo    7 年前

    另一个解决方案使用 foldr :

    \n -> flip (foldr ($)) . replicate n

        10
  •  0
  •   Alexey    12 年前
    iterate (f .) id !! n
    

    iterate (f .) f !! (n-1)
    

    取决于 n == 0 是允许的。

    推荐文章