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
结果