部分应用类型构造函数

时间:2018-06-07 08:50:17

标签: f#

我有一个带有两个参数的构造函数的类型:

type Foo = Foo of int * int

我可以用(int, int)的元组来调用它。

let foo = Foo(1,2)

但在我的情况下,我想部分应用构造函数在管道中使用它

let someFunc param =
    calculateSomeInt param
    |> Foo 42  //error

但这是不可能的,因为无法以curry形式调用构造函数。

是否有可能告诉F#我想要以咖喱形式构造函数而不必定义新函数let fooCtr a b = Foo (a,b)

2 个答案:

答案 0 :(得分:7)

不,没有。您在问题中提到的let fooCtr a b = Foo (a,b)方法是执行此操作的唯一方法。 (我可能会称之为makeFoo或更好mkFoo而不是fooCtr我自己,因为我觉得函数名称应该是动词,但这是个人风格偏好。)

答案 1 :(得分:1)

rmunn的回答是正确的,但我想补充一个细节。

您可以将构造函数作为参数添加到make函数中,这样您就可以使用make部分应用任何带有一对(2元组)作为参数的构造函数:

type TypeA =
    | A of int*int
    | B of int*string

type TypeB = 
    | C of int*float

// make : (('a * 'b -> 'c) -> 'a -> 'b -> 'c)
let make t a b = t(a,b)

// x : int -> TypeA
let x = make A 1

// y : string -> TypeA
let y = make B 2

// z : float -> TypeB
let z = make C 3

实际上,它适用于任何以一对作为参数的函数,因此在这种情况下,名称make稍有误导。