Generics 内联映射函数(函子)

Generics 内联映射函数(函子),generics,f#,Generics,F#,我正试图编写一个多态的映射(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)

我正试图编写一个多态的
映射
(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
类型结果=
|"成功"
|“恐怖名单”错误
具有
成员:这是地图f=
与此匹配
|成功(s)->成功(f s)
|错误(e)->错误e
这个内联函数

let inline (<!>) (f: ^A -> ^B) (t:^T) = 
    let map' = (^T : (member map : (^A -> ^B) -> ^T) (t, f))
    map'
let inline()(f:^A->^B)(t:^t)=
设映射“=(^T:(成员映射:(^A->^B)->^T)(T,f))
地图'
这个电话号码是多少

(fun x y -> x + y) <!> (Success 3);;
(乐趣x y->x+y)(成功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
(乐趣x y->x+y)(成功3);;
--------------------------------^
/Users/robkuz/stdin(404,33):错误FS0001:
此表达式应具有类型
“a->”b
但这里有一种类型
int
我不明白为什么会这样? 我没有指定
^T
必须为类型
^T)>
这在F#中无论如何都是不可能的


顺便说一句,像
(fun x->x+1)(Success 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
类型结果=
|"成功"
|“恐怖名单”错误
具有
成员this.map(f:'tsucess->'T)=
与此匹配
|成功s->成功(f s)
|错误e->错误e
让内联()(f:^A->^B)(t:^t):^U=
设映射“=(^T:(成员映射:(^A->^B)->^U)(T,f))
地图'
[]
让主argv=
让w=(乐趣x y->x+y)成功3
设x=(乐趣x->x2)w
printfn“%A”x//打印“成功5”
0

您将
f
声明为一元函数,但传入一个二进制函数。关于
(乐趣x->x+x)(成功3)
?这里有一个。也许你想试试这个?;-)似乎你已经有了答案,但同样的想法也适用于那里。