我正在尝试编写一个多态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)
这样的调用可以正常工作
答案 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