совпадать с typeof в fsharp - PullRequest
       22

совпадать с typeof в fsharp

11 голосов
/ 09 марта 2012

Первый матч работает, но не второй.Есть ли способ сопоставления без объявления переменных, кроме использования цепочки if / elif?

(обратите внимание, что я использую значение elem, а сопоставляю переменную t)

  let t = typeof<string>
  match propType with
  | t               ->  elem.GetValueAsString() :> obj
  | typeof<string>  ->  elem.GetValueAsString() :> obj

Ответы [ 2 ]

13 голосов
/ 09 марта 2012

Ваш первый шаблон на самом деле не соответствует typeof<string>. Он связывает propType с новым значением t, затеняя предыдущее t, равное typeof<string>.

Поскольку typeof<string> не является литералом, второй шаблон также не работает (хотя в вашем примере это избыточный шаблон). Вы должны использовать when охрану следующим образом:

  match propType with
  | t when t = typeof<string> -> elem.GetValueAsString() :> obj
  | t ->  elem.GetValueAsString() :> obj
6 голосов
/ 09 марта 2012

Если вы пытаетесь сопоставить тип значения, вы можете использовать:? оператор

Пример:

let testMatch (toMatch:obj) = match toMatch with
                        | :? string as s -> s.Split([|';'|]).[0]
                        | :? int as i -> (i+1).ToString()
                        | _ -> String.Empty
...