【发布时间】:2018-02-26 02:09:46
【问题描述】:
另一位成员建议的这段代码允许 fmap 一般与 Option 和 Choice 一起工作,编译并完美运行,但是有一个警告我正在努力理解和修复。最后一行,在“函子”下:
这种结构会导致代码不够通用。类型变量 'b 已被限制为 Functor。
type Functor = Functor
with
static member FMap (Functor, mapper : 'T -> 'U, opt : Option<'T>) : Option<'U> =
Option.map mapper opt
static member FMap (Functor, mapper : 'T -> 'U, ch : Choice<'T, _>) : Choice<'U, _> =
match ch with
|Choice1Of2 v -> Choice1Of2 (mapper v)
|Choice2Of2 v -> Choice2Of2 v
let inline fmap (f : ^c -> ^d ) (x : ^a) =
((^b or ^a) : (static member FMap : ^b * ( ^c -> ^d ) * ^a -> ^e ) (Functor, f, x))
这是有道理的,因为 ^b 应该始终是 Functor。
我想重新编写代码以解决此警告,但没有成功。
为此,我为什么需要 (^b 或 ^a) 而不仅仅是 ^a,因为 ^b 将始终是一个 Functor。我一直无法获得没有(^b 或 ^a)语法的编译版本。
另外,为什么有必要通过 Functor union case。再次,我无法理解和解决的问题。
感谢任何清晰。
【问题讨论】:
标签: .net static f# inline type-constraints