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