具有基本类型的F#元组

And*_*nde 1 f#

是否可以一起使用元组和类层次结构?

我无法获得一个函数来接受一个抽象类型的元组参数:

[<AbstractClass>]
type XBase () = 
    member val Name="" with get, set 

type X () = 
    inherit XBase ()  

type Y () = 
    inherit XBase ()  

//fine without tuples
let f(values:seq<XBase>) =       
    printf "ok."

f [new X(); new Y()]

//this function won't work 
let f1<'V when 'V :> XBase>(keysAndValues:seq<'V * string>) =       
    printf "ok."

//compiler error: This expression was expected to have type X but here it has type Y
//f1 [(new X(), ""); (new Y(), "")]

System.Console.ReadLine()
Run Code Online (Sandbox Code Playgroud)

Pet*_*etr 5

注释序列中的元组不是从同一基类派生的.类型的元组(XBase * string)是不是元组类的基类(X * string)(Y * string)SO 2种不同类型的这些具体实例不能在集合中放在一起.我认为任何.NET语言(C#,VB)都是如此.

所以你不能创建这个序列:

let tuples = [(new X(), ""); (new Y(), "")]
Run Code Online (Sandbox Code Playgroud)

但您可以使用以下两个序列调用f1函数:

f1 [(new X(), ""); (new X(), "")]
f1 [(new Y(), ""); (new Y(), "")]
Run Code Online (Sandbox Code Playgroud)

  • +1你也可以使用`let tuples = [(new X():> XBase,")); (new Y():> XBase,"")]`,它是`(XBase*string)list`. (3认同)
  • 对,那是正确的.问题是,元组不是协变的. (2认同)