let rec natadd_nat c =
match c with
| 0 -> O
| _ -> (S (natadd_nat (c-1)))
let rec natadd_int c =
match c with
| O -> 0
| S n' -> 1+(natadd_int n')
let natadd a b =
natadd_nat((natadd_int a) + (natadd_int b))
Это код, который я написал в ocaml. natadd_nat — это функция, которая преобразует int в символ, состоящий из O и S. natadd_int — это функция, которая преобразует символы O и S в int. Функция natadd изменяет символы a и b с natadd_int на int. И после добавления двух значений, измененных на int, поместите его в функцию natadd_nat и измените обратно на символ.
Но в функции natadd_nat
Unbound constructor O
ошибка произошла в
| 0 -> O
часть.
Как я могу это решить?
пример)
# let two = S (S O) ;;
# let three = S (S (S O)) ;;
# natadd two three ;;
- : nat = S (S (S (S (S O))))
Конструктор типа требует объявления типа с этими конструкторами (или в данном случае конструкторы.
Судя по коду, который вы опубликовали, вам, вероятно, не хватает чего-то вроде:
type nat = O | S of nat
спасибо! Я решил проблему. Но при вызове функции возникает ошибка. Когда я вызываю функцию natadd, возникает ошибка «Несвязанное значение natadd». Как я могу это решить?
Если это полный пример, вам не хватает определения типа, определяющего конструктор
O
иS
. Если это не полный пример, посмотрите, как создать минимальный воспроизводимый пример.