【问题标题】:Is there an F# cast function with type inference like Seq.cast?是否有像 Seq.cast 这样的类型推断的 F# 转换函数?
【发布时间】:2014-01-16 13:15:27
【问题描述】:

所以我有一些 COM 类型的名称难以记住、长而笨重,所以如果可以避免的话,我宁愿在从对象投射时不必输入它们。使用Seq.cast,它将推断所需的类型并根据需要进行强制转换。

这是一个用 int 代替的简化版本:

> let o = 1 :> obj;;
val o : obj = 1

> let inc x = x+1;;
val inc : int -> int

> inc o;;

  inc o;;
  ----^

stdin(15,5): error FS0001: This expression was expected to have type
    int    
but here has type
    obj    

好的,有道理。所以我们投了它:

> inc (o :?> int);;
val it : int = 2

但是,如果我使用 Seq.cast 进行转换,则不需要显式编写类型:

> inc ([o] |> Seq.cast |> Seq.head);;
val it : int = 2

下面有没有类似cast的函数?

> inc (o |> cast);;
val it : int = 2

是否有像 Seq.cast 这样具有类型推断功能的 F# cast 函数?

【问题讨论】:

  • 您可能对Seq.cast 期望过高:像inc ([2.0] |> Seq.cast |> Seq.head) 这样简单的东西会抛出InvalidCastException

标签: casting f# type-inference


【解决方案1】:

您可以使用 'unbox' 和 'box' 运算符来利用类型推断

inc (unbox o)

【讨论】:

  • 哇,这确实有效,即使在 COM 接口之间进行转换!
  • 显然,它只有在编译器可以推断类型时才会起作用,它可能无法推断出你想要的类型。如果您对答案感到满意,请接受它,以便将问题标记为已回答。
  • @LeafGarland:这与类型推断无关!只需 unbox(box a) 保留 a 的原始类型。所以inc unbox(box 2.0) 会抛出一个runtime异常。
  • @GeneBelitski,我不明白你的意思。 unbox 也需要类型转换,例如unbox<int> o 但如果可以推断出类型,那么您可以使用unbox o,这似乎是最初的问题所在。在运行时强制转换/拆箱是否正确肯定是另一回事?
  • @LeafGarland:你说得对,我必须收回我的评论;从 F# 编译器的角度来看,boxunbox 都是内联的泛型函数。
【解决方案2】:

正如 Leaf 所提到的,boxunbox 用于与 obj 的转换。对于其他类型,您可以使用 upcast 或静态转换运算符 (:>) 进行向上转换,并使用 downcast 或动态转换 (:?>) 运算符进行向下转换。可以使用通配符代替显式类型,例如:x :?> _

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-14
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    相关资源
    最近更新 更多