не до конца прояснили картину. Или только читать исходники какого-нибудь fsharpplus ?
Ну, тут же только синтаксис понять и всё
А что осталось непонятным?
Пример в офф доке. Но после чтения спеки стало сильно лучше
Я к тому что еслиб сформулировал что именно, возможно тут смогли бы прояснить
это http://www.fssnip.net/7Ts/title/F-SRTP-of-Type-Classes-from-OO-Perspective понятно. Это непонятно: let inline konst x _ = x type CFunctor() = static member inline fmap (f: ^a -> ^b, a: ^a list) = List.map f a static member inline fmap (f: ^a -> ^b, a: ^a option) = match a with | None -> None | Some x -> Some (f x) // default implementation of replace static member inline replace< ^a, ^b, ^c, ^d, ^e when ^a :> CFunctor and (^a or ^d): (static member fmap: (^b -> ^c) * ^d -> ^e) > (a, f) = ((^a or ^d) : (static member fmap : (^b -> ^c) * ^d -> ^e) (konst a, f)) // call overridden replace if present static member inline replace< ^a, ^b, ^c when ^b: (static member replace: ^a * ^b -> ^c)>(a: ^a, f: ^b) = (^b : (static member replace: ^a * ^b -> ^c) (a, f)) let inline replace_instance< ^a, ^b, ^c, ^d when (^a or ^c): (static member replace: ^b * ^c -> ^d)> (a: ^b, f: ^c) = ((^a or ^c): (static member replace: ^b * ^c -> ^d) (a, f)) // Note the concrete type 'CFunctor' specified in the signature let inline replace (a: ^a) (f: ^b): ^a0 when (CFunctor or ^b): (static member replace: ^a * ^b -> ^a0) = replace_instance<CFunctor, _, _, _> (a, f)
В фшарпе годная спека
уже согласен, в спеке сильно понятнее
это с мсдна кстати
https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/generics/statically-resolved-type-parameters
Я правильно понимаю, что в примере у CFunctora по сути сделали мультидиспатч для fmap ?..
Обсуждают сегодня