向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