я это dicriminated союз, который представляет собой примитивный тип:Как преобразовать список объектов в примитивный тип данных?
type Expr =
| Int of bigint
| Real of float
| Symbol of string
| Bool of bool
| List of Expr list
И я пишу функцию list : obj list -> Expr list
, которая будет проверять для типов объектов и преобразует их в Expr
«s соответственно:
let rec list : (obj list -> Expr list) = function
| head::tail ->
match head with
| :? string as x'-> Symbol (x') :: list tail
| :? int as x'-> Int(bigint x') :: list tail
| :? bigint as x' -> Int x' :: list tail
| :? bool as x' -> Bool x' :: list tail
| :? float as x' -> Real x' :: list tail
| :? Expr as x' -> x' :: list tail
| :? list<obj> as x' -> List(list x') :: list tail
| _ -> []
Случай | :? list<obj> as x' -> List(list x') :: list tail
, кажется, не соответствует при вызове этой функции во вложенном списке следующим образом: list [1;[2;1]]
это компилируется отлично, но возвращает ошибку, говоря, что случаи совпадения не были полными, кажется, что он пытается mach list<int>
с случаями, и он не находит его. Я ожидал, что list<obj>
будет соответствовать спискам любого типа 'a
, но это не так. Какую модель следует писать, чтобы она соответствовала списку любого типа? Функция отлично работает для не вложенных списков объектов.
Я думаю, вы должны задумайтесь над тем, почему вы хотите/должны это сделать - я обычно стараюсь не использовать этот тип времени выполнения проверка – Carsten
@Carsten Я пишу DSL для взаимодействия с Mathematica, это позволяет передавать список различных типов и вложенных списков в функцию Mathematica. Так, например, 'Таблица [Power [n; 2]; [П; 1; 10]] 'будет легальным синтаксисом в F # –
См. Http://stackoverflow.com/questions/8169233/f-pattern-matching-matching-functions-lists-of-subtypes и http://stackoverflow.com/questions/ 2140079/как к отливка-объект к-а-список-оф-родового типа-в-ф. – kvb