Совпадение с typeof в fsharp
Первое совпадение работает, но не второе.
Есть ли способ сопоставления без объявления переменных, помимо использования цепочки if/elif?
(Обратите внимание, что я использую значение elem, в то время как я сопоставляю переменную t)
let t = typeof<string>
match propType with
| t -> elem.GetValueAsString() :> obj
| typeof<string> -> elem.GetValueAsString() :> obj
Ответы
Ответ 1
Ваш первый шаблон фактически не соответствует typeof<string>
. Он привязывает propType
к новому значению t
, затеняя предыдущий t
, который равен typeof<string>
.
Так как typeof<string>
не является литералом, второй шаблон также не работает (хотя в вашем примере это избыточный шаблон). Вы должны использовать when
guard следующим образом:
match propType with
| t when t = typeof<string> -> elem.GetValueAsString() :> obj
| t -> elem.GetValueAsString() :> obj
Ответ 2
Если вы пытаетесь сопоставить тип значения, вы можете использовать:? Оператор
Пример:
let testMatch (toMatch:obj) = match toMatch with
| :? string as s -> s.Split([|';'|]).[0]
| :? int as i -> (i+1).ToString()
| _ -> String.Empty