Я пытаюсь понять синтаксис созданных алгебраических типов данных. Тип, который я создал, это [Int]
или Empty
, аналогично Maybe
с Just
и Nothing
, за исключением того, что Just
должен быть списком Int
. У меня возникают проблемы с пониманием манипулирования созданным типом, когда он принимает два входа и дает вывод того же типа.
data Example = Arg [Int]
| Empty
deriving Show
Я использую сопоставление с образцом и понимаю, что каждый случай должен быть рассмотрен; однако моя проблема связана с синтаксисом окончательного шаблона, где ни один не равен Empty
. Я пытаюсь написать две функции: одну, которая объединяет оба списка [Int]
из конструктора Example
, и я хочу создать функцию, которая показывает только набор [Int]
, который совместно использует оба, вместо объединения.
Первый выпуск объединяет два комплекта. Я могу сделать это в обычной функции, но где-то, используя тип данных Example
, синтаксис отключен, и я незнаком с ним. Самая большая проблема во втором - это то же самое: я понимаю рекурсию, но не понимаю синтаксиса рекурсии в созданном типе данных. Я также думал об использовании оператора where
во второй функции, но если я не могу правильно понять синтаксис базовой рекурсии, то сомневаюсь, что он будет успешным.
combine :: Example -> Example -> Example
combine Empty Empty = Empty
combine (Arg xs) Empty = (Arg xs)
combine Empty (Arg ys) = (Arg ys)
combine (Arg xs) (Arg ys) = Arg xs ++ ys
same :: Example -> Example -> Example
same _ Empty = Empty
same Empty _ = Empty
same (Arg x : xs) (Arg y : ys)
| x == y = x
| otherwise = same (Arg xs) (Arg ys)
Вывод combine
должен представлять собой список [Int]
, содержащий все Int
s из обоих списков; если один список пуст, он должен вернуть весь набор непустого списка.
Вывод same
должен содержать список [Int]
, содержащий только числа, общие для обеих групп, без повторов; если один набор пуст, выход пуст.