【发布时间】:2011-06-09 07:58:16
【问题描述】:
我有一个接受对象类型参数的函数,需要将其向下转换为option<obj>。
member s.Bind(x : obj, rest) =
let x = x :?> Option<obj>
如果我将(例如)Option<string> 作为x 传递,则最后一行将引发异常:无法转换类型为 'Microsoft.FSharp.Core.FSharpOption'1[System.String] 的对象' 输入 'Microsoft.FSharp.Core.FSharpOption'1[System.Object]'。
或者,如果我尝试类型测试:
member s.Bind(x : obj, rest) =
match x with
| :? option<obj> as x1 -> ... // Do stuff with x1
| _ -> failwith "Invalid type"
那么x 永远不会匹配option<obj>。
为了完成这项工作,我目前必须指定选项包含的类型(例如,如果函数传递了 option<string>,并且我将参数向下转换为该参数而不是 option<obj>,则该函数有效。
有没有一种方法可以将参数向下转换为 option<obj> 而无需指定选项包含的类型?我尝试了option<_>、option<#obj> 和option<'a>,结果相同。
作为背景,参数需要是obj类型,因为我正在为一个monad写一个接口,所以Bind需要根据实现该接口的monad来绑定不同类型的值。这个特定的 monad 是一个 continuation monad,所以它只是想确保参数是 Some(x) 而不是 None,然后将 x 传递给 rest。 (我需要接口的原因是因为我正在编写一个 monad 转换器,我需要一种方法来告诉它它的参数 monad 实现了绑定和返回。)
更新:我设法通过在选项成为此函数的参数之前向上转换选项的内容来解决这个问题,但我仍然很想知道我是否可以进行类型测试或转换一个对象(或通用参数)到一个选项,而不用担心选项包含什么类型(当然假设强制转换是有效的,即对象确实是一个选项)。
【问题讨论】:
-
我对你的问题做了一些额外的格式化,你可能想查看源(编辑)按钮,看看一些降价技巧。
-
谢谢kvb,这些看起来确实很有帮助。在发布这个问题之前,我花了一段时间挖掘这些信息,但当然不得不使用“选项”这个词出现了很多不相关的结果。