ocaml варианты типов манипуляций - PullRequest
2 голосов
/ 04 февраля 2012

У меня есть вариант типа, подобный этому:

type score = 
    InInteger of int
    | InFloat of float ;;

Теперь, учитывая две оценки (InInteger(5) и InFloat(5.5)), я хочу добавить, вычесть их и т. Д.

Как это можно сделать?

PS - я новичок в OCaml.

Редактировать ::

Более конкретно:

Как эторабота?

let n = InInt(2);;
let m = InFloat(3.2);;

let var = InFloat(float n +.  m);;

Ответы [ 2 ]

5 голосов
/ 05 февраля 2012

Во-первых, дискриминационные союзы требуют своих идентификаторов, начинающихся с прописных букв:

type score = 
    InInteger of int
    | InFloat of float

Во-вторых, вы можете определить функцию add для этого типа данных путем сопоставления шаблона со всеми возможными случаями и возврата соответствующих значений:

let add s1 s2 = 
    match s1, s2 with
    | InInteger i1, InInteger i2 -> InInteger (i1 + i2)
    | InInteger i1, InFloat f2   -> InFloat (float i1 +. f2)
    | InFloat f1, InInteger i2   -> InFloat (f1 +. float i2)
    | InFloat f1, InFloat f2     -> InFloat (f1 +. f2)
3 голосов
/ 05 февраля 2012

+. добавит только float с, а + добавит только int с.Это все, что нужно сделать!Если у вас есть float s или int s в вашем типе объединения, вы должны будете использовать match на ответ каждого пэда, чтобы получить их, а затем преобразовать простые числа в.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...