我是Ocaml的初学者,我想让未咖喱的函数成为咖喱。
例如,
let add (x,y) = x + y
这是一种未经处理的表单,我想创建一个名为“ curry”的函数,如
let inc = curry(add)(1)
let ret = inc(2)
如果我们应用自己的“ curry”,则可以部分应用。
由于我是第一次进入Ocaml,我只是想像
那样从add函数中的元组中提取条目(非常傻...)。let get_1_2 (a,_) = a
let get_2_2 (_,a) = a
let curry f tp = function
f (get_1_2 tp) (get_2_2 tp)
但是我知道这根本没有道理...
那我该如何开始?
答案 0 :(得分:0)
在转到一般情况之前,有时尝试一些示例会更容易。例如,对于添加功能,您可以从
开始let add (x,y) = x + y
您想去
let add2 x y = x + y
在这种情况下,您可以看到新的curried函数的右侧与旧的add函数的右侧相同。因此,您可以将curried函数重写为
let add2 x y = add (x,y)
如果您要进行乘法运算,我们可以从...进行相同的转换
let mult (x,y) = x * y
到
let mult2 x y = mult (x,y)
现在,如果您比较我们的两个咖喱函数
let mult2 x y = mult (x,y)
let add2 x y = add (x,y)
右侧看起来非常相似:它们的区别仅在于在两个参数上调用的函数的名称。如果我们要概括这两个函数,则一种解决方案是提供函数mult
或add
作为新函数的参数。现在将其称为f
:
let f mult_or_add x y = mult_or_add(x,y)
然后我们可以将mult2
和add2
重写为
let mult2 x y = f mult x y
let add2 x y = f add x y
下一步是标记x
和y
在mult2
和{{1}的新定义的右侧和左侧的相同位置出现},这意味着我们可以淘汰他们
add2
这意味着我们的函数let mult2 = f mult
let add2 = f add
将带有一对参数的函数转换为带有两个参数的咖喱函数。换句话说,f
可以更好地称为f
:
curry2
后续练习可能是尝试编写let curry2 f x y = f (x,y)
或curry3
函数。