【问题标题】:Powershell casting to F# discriminated unionPowershell 强制转换为 F# 可区分联合
【发布时间】:2015-10-07 08:36:19
【问题描述】:

我有一个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 中的 F# 可区分联合类型?

【问题讨论】:

  • 不确定这是否受支持,但 [Data+SchoolEmployee] 不起作用的原因是 + 内部类型字符串在 PowerShell 中表示“嵌套类”。你试过[Data.SchoolEmployee]吗?
  • 这个问题似乎与这个问题有关:stackoverflow.com/q/32973438/126014
  • 是的,很好,马克,同一个项目的一部分:-)

标签: powershell f#


【解决方案1】:

使用来自the related questionTeacher 记录的定义:

module People =  
    type Teacher = {
        FirstName:string
        LastName:string
        Age:int }

您可以像这样在 PowerShell 中创建一个新的 Teacher 对象:

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

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

这个$teacher 对象是Teacher 的一个实例记录类型

PS> $teacher.GetType().FullName
Ploeh.StackOverflow.Q32987498.People+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# 编写:

let teacher = { FirstName = "Jane"; LastName = "Doe"; Age = 27 };

NewTeacher 方法调用等价于这个 F# 表达式:

let emp = Teacher teacher

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多