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)
?这里有一个。也许你想试试这个?;-)似乎你已经有了答案,但同样的想法也适用于那里。