Haskell — экземпляр типа соответствия

Я определил тип Haskell, подобный следующему:

data TypeData = TypeA Int | TypeB String | TypeC Char deriving (Eq, Show)

В какой-то момент мне нужен способ отфильтровать [TypeData] для всех экземпляров, отличных от TypeC. Подпись функции, которую я пытаюсь написать:

-- Returns a tuple containing (TypeC elements, non-TypeC elements)
partitionTypeCs :: [TypeData] -> ([TypeData],[TypeData])

Функция partition показалась подходящей для этого:

-- Attempt:
partitionTypeCs data = partition (TypeData -> Bool) data

Однако я не могу понять, какая функция будет соответствовать сигнатуре типа TypeData -> Bool. Похоже, мне нужна функция, которая может определить, относится ли экземпляр типа к конкретному экземпляру. Я знаю, что могу использовать для этого сопоставление с образцом, написав другую функцию (isTypeC (TypeC _) = True), но есть ли более общий или линейный способ сопоставления экземпляров типов?


person Tanaki    schedule 09.09.2013    source источник


Ответы (2)


Я бы сделал это так:

partitionTypeCs = partition f where
  f (TypeC _) = False
  f _ = True

Должен признаться, я не понимаю, почему вам это не нравится. Вы не можете сравнивать с конструктором, использующим равенство, потому что задействован неизвестный параметр. Сопоставление с образцом делает именно то, что должно быть сделано здесь.

person nickie    schedule 09.09.2013

Сопоставление с образцом - в значительной степени ответ здесь. Это займет у вас 3 дополнительные строки (включая подпись типа), так что это не похоже на длинное решение. Вероятно, вы могли бы написать какой-нибудь шаблонный хэшкел, который мог бы сделать это в целом, но это кажется слишком сложным решением для чего-то такого простого.

isTypeC :: TypeData -> Bool
isTypeC (TypeC _) = True
isTypeC _ = False
person bheklilr    schedule 09.09.2013