Определение перегруженных операторов для функции - PullRequest
0 голосов
/ 25 сентября 2018

Я хочу определить «отношения», но определен как функции для Identity <'a>, seq <' a> и Option <'a>.

Я никогда не определял перегруженные операторы в F #.

Было бы неплохо использовать "+"!

   open FSharpPlus.Data

   type Relation = 
// ('a -> Identity<'b>) -> ('b -> 'c) -> ('a -> 'c)
    static member (+) (f,g) = 
        fun a ->  g ((f a) |> Identity.run)
// ('a -> #seq<'b>) ->  ('b -> #seq<'c>) -> ('a -> seq<'c>) 
    static member (+) (f , g ) = 
        fun a -> seq {
                    for b in f a do
                        yield! g b
                    }
// ('a -> seq<'b>) -> ('b -> Identity<'c>) -> ('a -> seq<'c>) 
    static member (+) (f,g) = 
        fun a -> seq {
                    for b in f a do
                        yield Identity.run (g b)
                    }

это компилируется ...

тогда я пытаюсь использовать его и;

member x.foo () = 
    let f1 : int -> Identity<int> = fun x -> Identity x
    let f2 : int -> seq<int> = fun x -> Seq.singleton x
    let x = f2 + f1
    ()

Я получаю:

FS0043  Expecting a type supporting the operator '+' but given a function type. You may be missing an argument to a function.

Я что-то делаю глупо?(Да!)

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