我正在尝试在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中做到这一点?
答案 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)
你很亲密。只需声明一个关闭c
和h
的函数。
foldn c h = f where
f 0 = c
f n = h . f $ n-1