多型map
(Functor)を作成しようとしていますが、このタイプのエラーが停止します。マップ関数をインライン化する(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#ではとにかくできません。
btw。 (fun x -> x + 1) <!> (Success 3)
のようなコールはうまく動作します
nope!変化なし。 – robkuz
'f'を単項として宣言していますが、バイナリ関数を渡しています。 '(fun x - > x + x)(成功3)'はどうでしょうか? – ildjarn
[詳しい説明](http://nut-cracker.azurewebsites.net/blog/2011/11/15/typeclasses-for-fsharp/)です。 – Gustavo