为什么内联静态类型解析在List上不起作用?
我试图编写一个内联map函数,该函数可以与任何具有mapx
作为静态成员的类型一起使用,其代码如下:
type Container<'T> =
{ value: 'T }
type container<'a> = Container<'a>
type Container<'T> with
static member mapx (f: 'T -> 'b, x: 'T container) = { value=f(x.value) } // tuple form...
type List<'T> with
static member mapx (f: 'T -> 'b, x: 'T list) = List.map f x
let inline map (f: ^a -> ^b) (x: ^t) =
(^t: (static member mapx: (^a -> ^b) -> ^t -> ^c ) (f, x)) // (2) curry form
let plus2 = (+) 2
let x = { value=2 } |> map plus2 // ok
let y = [1;2;3] |> map plus2 // (1) Error...
printfn "%A" x
printfn "%A" y
我有两个问题:
(1)这一行会导致编译器警告,但是以前的表达式是可以的!? 错误消息是
'int list'类型不支持操作符mapx
任何人都可以解释为什么它不能在列表上工作,但对Container有效吗? 以及我需要做什么才能使其与List一起工作?
(2)我是否正确使用约束? 我发现约束是用咖喱形式写的,但方法必须以元组的形式写出......这是相当困惑的。
谢谢!
F#不支持扩展成员的静态解析类型约束,这就是List
不起作用的原因。
当编译器可以的时候,它会将扩展语法成员编译为普通成员,这就是Container
工作的原因。
上一篇: Why inline static type resolution does not work on List?