Powershell铸造到F#区别联盟

Ala*_*gan 4 powershell f#

我有一个Powershell脚本,我已经加载了一个F#库并创建了一个F#记录表达式:

$teacher = Data+Teacher("Joan", "Doe", 27)
Run Code Online (Sandbox Code Playgroud)

现在我需要传递$teacher给一个函数,但在我做之前我需要将它向上转换为类型SchoolEmployee.当我尝试:

$schoolEmployee = $teacher -as [Data+SchoolEmployee]
Run Code Online (Sandbox Code Playgroud)

我有一个空的物体回来了.在我的F#模块中,我有一个有区别的联盟:

 module Data = 
     type SchoolEmployee =
     | Teacher of Teacher
     | Cleaner of Cleaner
Run Code Online (Sandbox Code Playgroud)

我如何向一个F#受歧视的联盟类型转发Powershell

Mar*_*ann 5

使用相关问题Teacher记录定义:

module People =  
    type Teacher = {
        FirstName:string
        LastName:string
        Age:int }
Run Code Online (Sandbox Code Playgroud)

您可以Teacher在PowerShell中创建一个新对象,如下所示:

$teacher = New-Object Ploeh.StackOverflow.Q32987498.People+Teacher("Jane", "Doe", 27)
Run Code Online (Sandbox Code Playgroud)

(我希望你能原谅我对命名空间的冗长使用,但这就是我编译Teacher类型的方法.)

$teacher对象是Teacher 记录类型的实例:

PS> $teacher.GetType().FullName
Ploeh.StackOverflow.Q32987498.People+Teacher
Run Code Online (Sandbox Code Playgroud)

Teacher记录类型是不一样的Teacher 情况下构造.案例构造函数不是类型; 这是一个功能.这就是演员表不起作用的原因.People+Teacher不是一个实例SchoolEmployee.实际上,People+Teacher编译为密封类.

要将其转换为SchoolEmployee值,您需要将其传递给NewTeacher方法:

$emp = [Ploeh.StackOverflow.Q32987498.Data+SchoolEmployee]::NewTeacher($teacher)
Run Code Online (Sandbox Code Playgroud)

$emp对象的类型SchoolEmployee如下:

PS> $emp.GetType().FullName
Ploeh.StackOverflow.Q32987498.Data+SchoolEmployee+Teacher
Run Code Online (Sandbox Code Playgroud)

New-ObjectPowerShell中的语句相当于在F#中编写它:

let teacher = { FirstName = "Jane"; LastName = "Doe"; Age = 27 };
Run Code Online (Sandbox Code Playgroud)

所述NewTeacher方法调用等效于这个F#表达式:

let emp = Teacher teacher
Run Code Online (Sandbox Code Playgroud)

在这里,也许更明显的是,Teachercase构造函数是一个函数,这也是它被编译为IL中的方法的原因.