Generics 为什么内联静态类型解析在列表上不起作用?

Generics 为什么内联静态类型解析在列表上不起作用?,generics,f#,inline,typeclass,Generics,F#,Inline,Typeclass,我正在尝试编写一个内联映射函数,它可以与任何类型一起使用,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) } /

我正在尝试编写一个内联映射函数,它可以与任何类型一起使用,
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
类型容器
键入容器'b,x:'T Container)={value=f(x.value)}//元组形式。。。
类型列表'b,x:'T List)=List.map f x
让内联映射(f:^a->^b)(x:^t)=
(^t:(静态成员mapx:(^a->^b)->^t->^c)(f,x))/(2)咖喱表单
设plus2=(+)2
设x={value=2}|>map plus2//ok
设y=[1;2;3]|>映射plus2/(1)错误。。。
printfn“%A”x
printfn“%A”y
我有两个问题:

(1)此行会导致编译器警告,但上一个表达式正常!?错误消息是

类型“int list”不支持运算符
mapx

有人能解释为什么它不适用于列表,但适用于容器吗?我要做什么才能使它与列表一起工作

(2)我是否正确使用了约束?我发现约束是以咖喱形式编写的,但方法必须是元组形式。。。这是相当混乱的

谢谢大家!

F#不支持扩展成员的静态解析类型约束,这就是为什么
List
不起作用


当编译器可以的时候,它会像普通成员一样编译扩展语法成员,这就是
容器
工作的原因。

这真的很棘手:'(顺便说一句,如果可以的话,请回答问题2?:)好吧,因为它适用于
容器
,所以可以安全地假设语法是正确的。