【问题标题】:Function which make uncurried curried(not using ramda library)使 uncurried curried 的函数(不使用 ramda 库)
【发布时间】:2019-09-21 00:53:01
【问题描述】:

我是 Ocaml 的初学者,我想将非咖喱函数柯里化。

例如,

let add (x,y) = x + y

这是一个非curry形式,我想制作一个名为“curry”的函数

let inc = curry(add)(1)
let ret = inc(2)

如果我们应用我自己的“咖喱”,它可以部分应用。

由于我是第一次使用 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)

但我知道这根本没有意义......
那么我该如何开始呢?

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    在转到通用案例之前尝试一些示例有时会更容易。例如,在添加函数的情况下,您从

    开始
    let add (x,y) = x + y
    

    你想去

    let add2 x y = x + y
    

    在这种情况下,您可以看到新 curried 函数的右侧与旧 add 函数的右侧相同。因此,您可以将柯里化函数重写为

    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
    

    下一步是注释xy出现在mult2add2的新定义的左右两边的相同位置,这意味着我们可以省略他们

    let mult2 = f mult
    let  add2 = f  add
    

    这意味着我们的函数f 将一个接受一对参数的函数转换为一个接受两个参数的柯里化函数。换句话说,f 可以更好地称为curry2

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

    后续练习可能是尝试编写 curry3uncurry2 函数。

    【讨论】:

      猜你喜欢
      • 2017-05-10
      • 2017-10-07
      • 2020-10-25
      • 2018-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 2017-02-22
      相关资源
      最近更新 更多