Взаимодействие других типов данных с собственным построенным типом данных Natural. - PullRequest
0 голосов
/ 25 октября 2018

Я создал свой собственный тип данных, созданный для натуральных чисел.

data Natural = Zero | Succ Natural 
instance Show Natural where 
         show (Zero) = "0"
         show (Succ Zero) = "S 0"
         show (Succ n) = "S(" ++ show n ++ ")"

Я пытаюсь создать функцию для взаимодействия с базовыми типами данных (в основном Int), определенными следующим образом:

intToNat:: Int -> Natural
intToNat 0 = Zero
intToNat n = (Succ n) - 1

natToInt:: Natural -> Int
natToInt Zero = 0
natToInt (Succ n) = 1 + natToInt n

Ну, это вообще не работает, дело в том, что я должен сохранить эту функцию как рекурсивную функцию.Я не знаю, была бы полезна функция read в этом.

UPDATE : способ компиляции кода используется в функции:

intToNat:: Int -> Natural
intToNat 0 = Zero
intToNat n = Succ(Succ Zero) --Obviusly this method return a constant number, in this case: 2.

Так что в этом случае, я думаю, это связано, но я хочу знать, существует ли «рекурсивный» способ определения «цикла» Suc Zero n-1 раз.

ФИНАЛЬНОЕ обновление: intToNat определяется следующим образом:

intToNat:: Int -> Natural
intToNat 0 = Zero
intToNat n = Suc(intToNat (n-1))

1 Ответ

0 голосов
/ 25 октября 2018

natToInt выглядит нормально.Zero, Succ n и n имеют тип Natural.1 и natToInt n имеет тип Int.Вы звоните + на двух Int с.

В inToNat, n имеет тип Int, но Succ требуется Natural.Затем вы пытаетесь вычесть 1 из Natural, но вы не определили - для Natural (по крайней мере, не в коде в вашем вопросе).Ваш intToNat не является рекурсивным, но вы, вероятно, хотите, чтобы он был.

Как правило, вы на правильном пути.read не обязательно.

...