Совпадение с 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