向F#歧视联盟铸造Powershell

向F#歧视联盟铸造Powershell,powershell,f#,Powershell,F#,我有一个Powershell脚本,我加载了一个F#库,并创建了一个F#记录表达式: $teacher = Data+Teacher("Joan", "Doe", 27) 现在,我需要将$teacher传递给一个函数,但在此之前,我需要将其向上转换为键入SchoolEmployee。当我尝试时: $schoolEmployee = $teacher -as [Data+SchoolEmployee] 我拿回一个空的东西。在我的F#模块中,我有一个受歧视的联盟: module Data =

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

$teacher = Data+Teacher("Joan", "Doe", 27)
现在,我需要将
$teacher
传递给一个函数,但在此之前,我需要将其向上转换为键入
SchoolEmployee
。当我尝试时:

$schoolEmployee = $teacher -as [Data+SchoolEmployee]
我拿回一个空的东西。在我的F#模块中,我有一个受歧视的联盟:

 module Data = 
     type SchoolEmployee =
     | Teacher of Teacher
     | Cleaner of Cleaner

如何在
Powershell
中使用
Teacher
记录的此定义向上转换为
F#
有区别的联合类型?

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

$teacher = New-Object Ploeh.StackOverflow.Q32987498.People+Teacher("Jane", "Doe", 27)
(我希望您能原谅我冗长地使用名称空间,但我就是这样编译
Teacher
类型的。)

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

Teacher
记录类型与
Teacher
案例构造函数不同。案例构造函数不是类型;这是一个函数。这就是演员阵容不起作用的原因
People+Teacher
不是
SchoolEmployee
的实例。事实上,
People+Teacher
被编译成一个密封的类

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

$emp = [Ploeh.StackOverflow.Q32987498.Data+SchoolEmployee]::NewTeacher($teacher)
$emp
对象的类型为
SchoolEmployee

PS> $emp.GetType().FullName
Ploeh.StackOverflow.Q32987498.Data+SchoolEmployee+Teacher
PowerShell中的
New Object
语句相当于在F#中编写此语句:

NewTeacher
方法调用相当于此F#表达式:

let emp = Teacher teacher

在这里,可能更明显的是
教师
案例构造函数是一个函数,这也是它被编译为IL中的方法的原因。

甚至不确定是否支持它,但
[Data+SchoolEmployee]
不起作用的原因是类型字符串中的
+
表示PowerShell中的“嵌套类”。你试过
[Data.SchoolEmployee]
?这个问题似乎与这个问题有着奇怪的联系:是的,很好,是同一个项目的一部分:-)
PS> $emp.GetType().FullName
Ploeh.StackOverflow.Q32987498.Data+SchoolEmployee+Teacher
let teacher = { FirstName = "Jane"; LastName = "Doe"; Age = 27 };
let emp = Teacher teacher