F# 如何将具有公共基类的子类型的实例添加到FSharp中的同一列表中?

F# 如何将具有公共基类的子类型的实例添加到FSharp中的同一列表中?,f#,F#,我有一个名为Token的基本抽象类和一些子类型,如NumToken,StrToken 我想把它们的实例放在同一个列表中 我不能声明变量uselet l=list Token> 然后,我写 let extractToken<'a when 'a :> Token>(lineNum:int, line:string) : 'a list option = let mutable result : 'a list = [] 让extractToken令牌

我有一个名为
Token
的基本抽象类和一些子类型,如
NumToken
StrToken

我想把它们的实例放在同一个列表中

我不能声明变量use
let l=list Token>

然后,我写

    let extractToken<'a when 'a :> Token>(lineNum:int, line:string) : 'a list option =
        let mutable result : 'a list = []  
让extractToken令牌>(lineNum:int,line:string):'一个列表选项=
让可变结果:'a list=[]
它可以工作,但不能添加元素。
result
也不能工作,它只接受一个子类型


Thx以获取帮助。

当您使用类层次结构对令牌建模并创建令牌列表时,列表的类型需要特定。您可以返回
list
list

带有
when
约束的灵活类型只在非常罕见的情况下有用-通常,当您有一个函数接受其他函数并返回其他函数生成的任何内容时,因此我认为这里不需要它们。您可以使用
列表
并编写:

result <- (NumToken(lineNum, value) :> Token) :: result 
然后,您可以编写一个函数,通过编写

result <- (NumToken 42) :: result

result当您使用类层次结构对令牌建模并创建令牌列表时,列表的类型需要特定。您可以返回
list
list

带有
when
约束的灵活类型只在非常罕见的情况下有用-通常,当您有一个函数接受其他函数并返回其他函数生成的任何内容时,因此我认为这里不需要它们。您可以使用
列表
并编写:

result <- (NumToken(lineNum, value) :> Token) :: result 
然后,您可以编写一个函数,通过编写

result <- (NumToken 42) :: result
结果