Собственные типы данных - преобразование между ними и нативными - PullRequest
3 голосов
/ 24 октября 2019

Мне нужно сделать свой собственный тип данных для представления натуральных чисел. Типы данных (предварительно) определены следующим образом. Кроме того, мне нужно создать функции для преобразования между собственным типом данных Int и данным. Мне удалось преобразовать из Int в заданные, а также проверить, является ли мой тип данных ZZ нулевым. Хотя я действительно не могу найти способ конвертировать что-либо, кроме Zero, обратно в Int. Я надеюсь, что вы, ребята, можете дать мне подсказку о том, как это сделать.

data IN_1 = One | Follower IN_1 deriving Show
data ZZ   = Zero | Plus IN_1 | Minus IN_1 deriving Show

type Zed = Int


from_Zed_to_ZZ :: Zed-> ZZ
from_Zed_to_ZZ x 
 | x == 0 = Zero
 | x > 0 = Plus (helper(x))
 | x < 0 = Minus (helper(abs(x)))

helper :: Zed -> IN_1
helper x 
 | x==1 = One
 | otherwise = Follower (helper(x-1))


instance Eq ZZ where
    (==) Zero Zero = True


from_ZZ_to_Zed :: ZZ -> Zed
from_ZZ_to_Zed x |x == Zero = 0

Это мои текущие контрольные примеры: контрольные примеры

1 Ответ

2 голосов
/ 24 октября 2019

Способ "развернуть" значения, заключенные в алгебраические типы данных, заключается в сопоставлении с образцом. Каждый параметр функции является не просто идентификатором, а фактически шаблоном . Шаблон может быть просто идентификатором, но это могут быть и другие вещи. В частности, шаблон может быть указан как имя конструктора данных (например, Plus), за которым следуют один или несколько других шаблонов, по одному для каждого параметра этого конструктора.

В вашем случае:

from_ZZ_to_Zed :: ZZ -> Zed
from_ZZ_to_Zed Zero = 0
from_ZZ_to_Zed (Plus x) = ...
from_ZZ_to_Zed (Minus x) = ...

Затем, чтобы преобразовать из IN_1 в Zed, используйте рекурсию, аналогичную реализованной вами helper:

unhelper :: IN_1 -> Zed
unhelper One = 1
unhelper (Follower x) = unhelper x + 1

И используйте это для Plus и Minusслучаи:

from_ZZ_to_Zed (Plus x) = unhelper x
from_ZZ_to_Zed (Minus x) = - (unhelper x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...