F #: применить значение, как будто это функция - PullRequest
2 голосов
/ 03 июня 2019

Возможно ли в F # применить значение, как если бы оно было функцией? Например:

let record =
    {|
        Func = fun x -> x * x
        Message = "hello"
    |}
let message = record.Message   // unsweetened field access
let unsweet = record.Func 3    // unsweetened function application
let sweet = record 3           // sweetened function application

Сейчас последняя строка не компилируется, конечно:

error FS0003: This value is not a function and cannot be applied.

Существует ли какой-нибудь синтаксический подсластитель, который позволил бы мне «маршрутизировать» приложение функции по своему усмотрению, сохраняя при этом его нормальное несладкое поведение? Я думаю о чем-то волшебном:

// magically apply a record as though it was a function
let () record arg =
    record.Func arg

(Примечание: я использовал запись в этом примере, но я также был бы счастлив с классом.)

1 Ответ

2 голосов
/ 03 июня 2019

Самым близким, что я могу придумать, будет пользовательский оператор, использующий статически разрешенные параметры типа для разрешения определенного свойства типа FSharpFunc, а затем вызовет функцию с предоставленным входным параметром.Как то так:

let record =
    {|
        Func = fun x -> x * x
        Message = "hello"
    |}

let inline (>.>) (r: ^a) v = 
    let f = (^a : (member Func: FSharpFunc< ^b, ^c>) r)    
    f v

record >.> 3 // val it : int = 9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...