我有一个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?
使用相关问题的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中的方法的原因.