内联地图函数(Functor)

时间:2016-06-21 15:18:15

标签: generics f#

我正在尝试编写一个多态map(Functor)但我停止了这种类型的错误。

给出以下类型

type Result<'TSuccess, 'TError> = 
    | Success of 'TSuccess 
    | Error of 'TError list
    with 
    member this.map f =
        match this with
            | Success(s) -> Success(f s)
            | Error(e) -> Error e

和这个内联函数

let inline (<!>) (f: ^A -> ^B) (t:^T) = 
    let map' = (^T : (member map : (^A -> ^B) -> ^T) (t, f))
    map'

和这个调用代码

(fun x y -> x + y) <!> (Success 3);;

我收到此错误

(fun x y -> x + y) <!> (Success 3);;
--------------------------------^
/Users/robkuz/stdin(404,33): error FS0001: 
This expression was expected to have type
 'a -> 'b
but here has type
 int

我不明白为什么会这样? 我没有指定^T必须是类型为
的类型 ^T<('a->'b>)>这在F#中是不可能的。

顺便说一句。像(fun x -> x + 1) <!> (Success 3)这样的调用可以正常工作

1 个答案:

答案 0 :(得分:3)

也许我错过了一些显而易见的事情,但只是对<!>进行了一些小改动,它是否有效?

type Result<'TSuccess, 'TError> = 
  | Success of 'TSuccess 
  | Error   of 'TError list
  with 
  member this.map (f : 'TSuccess -> 'T) =
    match this with
    | Success s -> Success (f s)
    | Error   e -> Error e

let inline (<!>) (f : ^A -> ^B) (t : ^T) : ^U =
  let map' = (^T : (member map : (^A -> ^B) -> ^U) (t, f))
  map'

[<EntryPoint>]
let main argv = 
  let w = (fun x y -> x + y) <!> Success 3
  let x = (fun x -> x 2) <!> w
  printfn "%A" x // Prints "Success 5"
  0