为什么内联静态类型解析在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工作的原因。

链接地址: http://www.djcxy.com/p/80665.html

上一篇: Why inline static type resolution does not work on List?

下一篇: Behavior of F# "unmanaged" type constraint