是否存在多次应用转换的标准高阶函数?

vid*_*idi 6 f# ocaml haskell functional-programming ml

我在考虑这样的函数:

> let applyN (initial : 't) (n:int) (f : 't -> 't) = seq {1..n} |> Seq.fold (fun s _ -> f s) initial;;

val applyN : initial:'t -> n:int -> f:('t -> 't) -> 't

> applyN 0 10 (fun x -> x + 1);;
val it : int = 10
Run Code Online (Sandbox Code Playgroud)

注意:代码是F#,但我用haskell,ocaml和ml标签标记了问题,因为如果函数在F#库中不存在但是它存在于其他语言中我想使用相同的名称

Eri*_*lun 7

你会得到(非常接近)一个答案,例如使用Hayoo(或Hoogle,但Hoogle不那么灵活 - iterateN没有找到):

  • 搜索Int -> (a -> a) -> a -> a显示的几个函数可以执行您想要的但不是stdlib的一部分.

  • 搜索applyN返回的函数与您正在查找的类型签名完全相同.

  • 通过搜索laxing返回值Int -> (a -> a) -> a(注意最后的缺失-> a),你得到了iterateN :: Int -> (a -> a) -> a -> Seq aerdeszt已经提到过的函数.

PS Hoogle似乎更有能力翻转参数顺序:(a -> a) -> Int -> a -> Seq a成功返回'iterateN :: Int - >(a - > a) - > a - > Seq a`,而Hayoo没有.