Проверка правильности типов для всего содержимого типа записи рекурсивно в OCaml - PullRequest
0 голосов
/ 20 февраля 2019

Я не уверен, есть ли лучший способ сделать это, но мне было интересно, как я могу убедиться, что все типы записей являются точными.Я попробовал следующий код ниже (создание рекурсивной функции для поиска в записи) и собирался ставить совпадения для каждого уровня / сценария ... Я несколько новичок в OCaml (больше из C и Python), поэтому яборется с этим синтаксисом.

type typeA= Int | Bool | List of typeA

type highestLevelObject= typeA* typeB and typeB= 
  |Float of float
  | BoolLit of bool
  | Int of int
  | Seq of highestLevelObjectlist
  | Bool of bool

(* The function to ensure my Object came in good *)
let rec verifyFields (highestLevelObject: highestLevelObject): bool = 
match highestLevelObject with 
| int-> true
| bool -> true
| _ -> verifyFields highestLevelObject 

Это компилируется с предупреждениями ... Предупреждение 10: это выражение должно иметь тип unit.(относительно _ -> case) Предупреждение 11: этот регистр совпадений не используется.(относительно _ -> case и bool -> case) странно

В List должно быть что-то особенное, и здесь базовый случай ... соответствует каждому типу вручную или, если есть, лучше (более элегантно)) способ сделать это?Глядя на https://ocaml.org/learn/tutorials/data_types_and_matching.html также, но все еще изо всех сил.

1 Ответ

0 голосов
/ 20 февраля 2019

При сопоставлении с образцом вы должны деконструировать данные с помощью конструкторов данных, например:

match highestLevelObject with
| Int -> true
| Bool -> true
| Seq objs -> ...
| _ -> false

Обратите внимание на заглавную Int, которая является конструктором данных , в отличие от intэто просто имя переменной, поэтому, когда вы пишете

match highestLevelObject with
| int -> ...

, это то же самое, что сказать

match highestLevelObject with
| anything -> ...

на самом деле, anything здесь может быть любое имя переменной, которое будетсопоставлять любые данные и связывать себя с ними.Другими словами, match x with y -> f y совпадает с let y = x in f y

...