У меня есть функция, которая принимает параметр типа object и должна уменьшить его до 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
, потому что я пишу интерфейс для монады, поэтому Bind должен связывать значения diffРазличные типы в зависимости от монады, которая реализует интерфейс.Эта конкретная монада является монадой продолжения, поэтому она просто хочет убедиться, что параметр равен Some(x)
, а не None
, затем передайте x
на отдых.(Причина, по которой мне нужен интерфейс, заключается в том, что я пишу монадный преобразователь, и мне нужен способ сказать ему, что его монады параметров реализуют связывание и возврат.)
Обновление: Мне удалосьчтобы обойти это, выгрузив содержимое опции до того, как она станет параметром этой функции, но мне все еще интересно узнать, могу ли я проверить тип или привести объект (или универсальный параметр) к опции, не беспокоясь о том, чтовведите опцию (при условии, конечно, что приведение правильное, т.е. объект действительно является опцией).