Частично применить конструктор типов - PullRequest
0 голосов
/ 07 июня 2018

У меня есть тип с конструктором, принимающим два аргумента:

type Foo = Foo of int * int

И я могу назвать его с набором (int, int).

let foo = Foo(1,2)

Но в моем случае яхочу частично применить конструктор, чтобы использовать его в трубе

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

Но это невозможно, потому что конструктор нельзя вызвать в карри.

Есть ли возможность сообщить F # Iхотите конструктор в форме карри без определения новой функции let fooCtr a b = Foo (a,b)?

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

Ответ 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 в этом случае слегка вводит в заблуждение,

0 голосов
/ 07 июня 2018

Нет, нет.Подход let fooCtr a b = Foo (a,b), который вы упомянули в своем вопросе, - единственный способ сделать это.(Я бы, вероятно, назвал бы это makeFoo или еще лучше mkFoo, а не fooCtr сам, поскольку я чувствую, что имена функций должны быть глаголами, но это личное предпочтение стиля).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...