如何在Haskell中返回带有递归定义的柯里化函数?
如何在Haskell中实现你的JavaScript折叠函数
让我们一步步拆解问题,先理清你的JavaScript代码逻辑,再把它正确转换成Haskell实现。
首先,你的JS代码逻辑很清晰:fold接受初始值c和迭代函数h,返回一个递归函数f。当f被调用时:
- 如果参数是
0,直接返回初始值c - 否则用
h处理f(n-1)的结果,实现递归迭代
调用fold(1, x=>x*10)(3)最终会得到1*10*10*10 = 1000,这是我们要复刻的目标结果。
你原有Haskell代码的问题
你写的代码存在语法和逻辑双重问题:
- 语法错误:
where块内的多个定义没有正确分隔(需要换行或分号) - 逻辑错误:错误地将
n绑定为foldn的参数,实际上n是返回函数f要接收的参数 - 冗余代码:
h(f'(n-1))后面多余的f完全没必要,不符合原JS逻辑
正确的Haskell实现
我们可以写出简洁且符合原逻辑的代码,同时保留你想要的递归命名函数f:
首先添加类型签名(Haskell的好习惯,能帮你明确函数逻辑):
-- 类型签名:接受初始值c、迭代函数h,返回一个接收Int参数的递归函数 foldn :: a -> (a -> a) -> (Int -> a)
然后实现函数:
foldn c h = f where f 0 = c f n = h (f (n - 1))
代码解释:
foldn c h直接返回我们定义的递归函数f,Haskell默认支持柯里化,这和你JS里返回函数的逻辑完全一致where块内的f是递归命名函数:- 当输入为
0时返回初始值c - 否则递归调用
f(n-1),再将结果传给h处理
- 当输入为
测试一下这个函数:在GHCi中运行foldn 1 (*10) 3,会得到1000,和你的JS代码结果完全一致。
如果你更喜欢用let而非where,也可以写成等价形式:
foldn c h = let f 0 = c; f n = h (f (n-1)) in f
内容的提问来源于stack exchange,提问作者coder_bro
相关产品推荐
相关产品推荐

