Это работает:
// sample objects
let dctStrDbl = [("k1",1.0); ("k2",2.0)] |> Map.ofList
let dctStrStr = [("k1","v1"); ("k2","v2")] |> Map.ofList
let lstMisc = [1; 2; 3]
let testStrDbl (odico : obj) : bool =
match odico with
| :? Map<string,double> as d -> true
| _ -> false
let testTrue = testStrDbl (box dctStrDbl) // this evaluates to true
let testFalse = testStrStr (box dctStrStr) // this evaluates to false
let testMiscFalse = testStrDbl (box lstMisc) // evaluates to false
Однако я бы хотел сопоставить шаблон с универсальной картой типа Map<'k,'v>
(а не с картой конкретного типа, такой как Map<string,double>
).В псевдокоде:
let testGenMap (odico : obj) : bool =
match odico with
| :? Map<'k,'v> as d -> true
| _ -> false
, но это не работает, так как они оба оценили бы как ложное
let testStrDblGen = testGenMap (box dctStrDbl)
let testStrDblGen = testGenMap (box dctStrStr)
Мой вопрос: есть ли способ сопоставления с универсальным Map<'k,'v>
?
= РЕДАКТИРОВАТЬ =======
Возможно, мне следовало бы дать какой-то дополнительный контекст.Что мне действительно нужно, так это
let findGen (odico : obj) (defVal : 'a) (apply : (Map<'k,'v> -> 'a)) : 'a =
match odico with
| :? Map<'k,'v> as d -> apply d
| _ -> defVal // the object is not of the expected type
... где я могу восстановить универсальные типы 'k
и 'v
.В этом смысле предлагаемое решение nilekirk не будет работать как есть.