在Haskell中,我如何返回具有递归定义的curried函数?

时间:2018-01-21 07:41:26

标签: haskell currying

我正在尝试在Haskell中实现以下(在Javascript中定义): JS:

const fold = (c, h) => {
  const f = (n) => {
    return n === 0 ? c : h (f(n-1))
  }
  return f
}

fold(1, (x)=>x*10)(3)

Repl Link:https://repl.it/repls/ExperiencedTeemingLorikeet

我沿着这些方向尝试了一些东西(但不起作用):

foldn c h =
 f  = f' n
      where f' 0 = c
            f' n =  h(f'(n-1))
 f

基本上我正在尝试创建一个可以返回的命名curried函数“f”。另请注意,“f”的定义是递归 我怎么能在Haskell中做到这一点?

2 个答案:

答案 0 :(得分:2)

实际上,默认情况下,Haskell中的所有函数都是curry,所以你可以这样做

fold c h n = if n == 0 then c else h (fold c h (n-1))

如果您仍然希望内部有f,那么

fold c h = f
    where
        f 0 = c
        f n = h (f (n-1))

这些版本是等效的,可以像

一样调用
fold 1 (*10) 3

答案 1 :(得分:1)

你很亲密。只需声明一个关闭ch的函数。

foldn c h = f where
  f 0 = c
  f n =  h . f $ n-1