使未咖喱咖喱的功能(不使用ramda库)

时间:2019-05-02 13:23:32

标签: ocaml

我是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)

但是我知道这根本没有道理...
那我该如何开始?

1 个答案:

答案 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)

右侧看起来非常相似:它们的区别仅在于在两个参数上调用的函数的名称。如果我们要概括这两个函数,则一种解决方案是提供函数multadd作为新函数的参数。现在将其称为f

 let f mult_or_add x y = mult_or_add(x,y)

然后我们可以将mult2add2重写为

let mult2 x y = f mult x y
let  add2 x y = f  add x y

下一步是标记xymult2和{{1}的新定义的右侧和左侧的相同位置出现},这意味着我们可以淘汰他们

add2

这意味着我们的函数let mult2 = f mult let add2 = f add 将带有一对参数的函数转换为带有两个参数的咖喱函数。换句话说,f可以更好地称为f

curry2

后续练习可能是尝试编写let curry2 f x y = f (x,y) curry3函数。