f#类型提供者继承

Lel*_*tch 8 inheritance f# type-providers

我设计了一个简单的类型提供程序,它根据我的参数提供类型.我想知道是否可以定义将继承另一个ProvideTypeDefinition的ProvidedTypeDefinitions?

我知道我可以做以下事情:

type People() = class end

type Student() =
    inherit People() 

type Teacher() =
    inherit People()
Run Code Online (Sandbox Code Playgroud)

然后我可以使用Type Test Pattern进行模式匹配:

let f (x:People) =
    match x with
        | :? Student -> "Student"
        | :? Teacher -> "Teacher"
        | _ -> "Nothing !!"
Run Code Online (Sandbox Code Playgroud)

我想在我的Type提供程序中做的是创建继承另一个ProvideTypeDefinition的ProvidedTypeDefinitions.这样当我使用类型提供程序生成这些类型时,我可以对它们进行模式匹配(例如,我知道在运行时,其中一种类型将被实例化,但我不知道哪一种除了它是ProvideTypeDefinitions之一).

感谢您的时间!

小智 1

尝试使用可区分联合来进行模式匹配而不是继承

type Occupation =
  | Student
  | Teacher

type People(occupation) = 
  member this.Occupation = occupation
class end

type Student() =
  inherit People(Student) 

type Teacher() =
  inherit People(Teacher)

let findPerson (person : People) =
  match person.Occupation with
    | Student -> "Student"
    | Teacher -> "Teacher"
Run Code Online (Sandbox Code Playgroud)

由于向上转型和向下转型,我个人喜欢避免在 fsharp 中使用对象继承。例如,

let person = new Student() :> People
findPerson person
Run Code Online (Sandbox Code Playgroud)

相反,我建议摆脱学生和教师解析,让人们处理职业逻辑。

type Occupation =
  | Student
  | Teacher

type People(occupation) = 
  member this.Occupation = occupation
class end

let findPerson (person : People) =
  match person.Occupation with
    | Student -> "Student"
    | Teacher -> "Teacher"

People Student
|> findPerson
|> printfn "%s"
Run Code Online (Sandbox Code Playgroud)