Соответствие шаблону F # по универсальному параметру - PullRequest
0 голосов
/ 10 октября 2018

У меня здесь странный.Я хочу сопоставить тип универсального параметра.Вот что у меня есть:

open System.Reflection

type Chicken = {
    Size : decimal
    Name : string
}

let silly<'T> x =
    match type<'T> with
    | typeof<Chicken> -> printfn "%A" x
    | _ -> printfn "Didn't match type"
    enter code here

Я хочу, чтобы функция silly<'T> приняла общий параметр и затем сопоставила его с типом в функции, чтобы определить вывод.Прямо сейчас я получаю ошибку компилятора о неправильном отступе.Я уверен, что отступы в порядке, но есть кое-что в том, что я делаю, компилятору просто не нравится.Мысли?У меня есть обходной путь грубой силы, но этот подход был бы намного проще.

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Я думаю, это то, что вы ищете:

let silly x =
    match box x with 
    | :? Chicken as chicken -> printfn "is a  chicken = %s %A" chicken.Name chicken.Size
    | :? string  as txt     -> printfn "is a  string  = '%s'"  txt
    | :? int     as n       -> printfn "is an int     = %d"    n
    | _                     -> printfn "Didn't match type"

Назовите это так:

silly "Hello"
silly 7
silly { Name = "Claudius" ; Size = 10m }

// is a  string  = 'Hello'
// is an int     = 7
// is a  chicken = Claudius 10M
0 голосов
/ 10 октября 2018

Это то, что я всегда делал, не уверен, что это «лучший», но это работает и имеет смысл для моей команды и меня.

let silly<'T> x =
  match typeof<'T> with
  | t when t = typeof<TypeA>  -> TypeASpecificFunction x
  | t when t = typeof<TypeB>  -> TypeBSpecificFunction x
  | t when t = typeof<TypeC>  -> TypeCSpecificFunction x
  | _                         -> printfn "Didn't match type"

Для этого требуется общая функция, которая у вас есть,этот подход не будет работать с typeof напрямую, вы должны сделать typeof <'T>.

...