f#类型提供者继承

时间:2016-05-20 00:37:14

标签: inheritance f# type-providers

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

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

type People() = class end

type Student() =
    inherit People() 

type Teacher() =
    inherit People()

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

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

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

感谢您的时间!

2 个答案:

答案 0 :(得分:1)

尝试使用Discriminated Union进行模式匹配而不是继承

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"

由于upcasting and downcasting,我个人希望避免在fsharp中使用对象继承。例如,

let person = new Student() :> People
findPerson person

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

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"

答案 1 :(得分:0)

提供的类型之间的继承非常困难。你可以阅读这个article来了解如何做到这一点,但即使在它中你也会看到作者尽管付出了最大努力但收效甚微。似乎类型提供者机制的当前实现在从其他提供的类型继承所提供的类型方面不是很容易。

我对你的建议要简单得多,只需使用active patterns,你就可以匹配你想要的任何东西。

编辑:事实上,你甚至不必使用活动模式,因为你可以在类型上进行模式匹配。