我有一个带有两个参数的构造函数的类型:
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)
?
答案 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
稍有误导。