2013-07-05 2 views
6

Я не уверен, что заголовок достаточно описательный, но я не очень опытен в Haskell. Я хочу, чтобы сделать класс типов для конструкторов типа двупараметрического, что зависит от типа, по которому параметризованному конструктору, какДеконструкция типа в определении класса (Haskell)

class MyTypeclass (ctor a b) where 
    funct :: (ctor a b) -> a 

(при условии, ctor :: * -> * -> *, a :: *, b :: *) и, предполагая, что у меня есть

data Pair a b = Pair a b 

быть в состоянии сделать что-то вроде

instance MyTypeclass (Pair a b) where 
    funct :: Pair a b -> a 
    funct (Pair x _) = x 

возможно без нескольких классов типов параметров (потому что он» s слишком мощный - я просто хочу, чтобы деконструировать тип, который мой typeclass параметризован)?

ответ

7

Да, вы можете использовать так называемые "конструктор класса", которые имеют более высокие kinded типов:

class C ctor where 
    funct :: ctor a b -> a 

instance C Pair where 
    funct (Pair x _) = x 

instance C (,) where 
    funct = fst  -- (a,b) -> a 
+0

Спасибо! Оно работает. Но я очень обеспокоен объемом вывода типа, который там случается - как я могу сделать двухпараметрическое typeclass с двумя классами конструкторов? Мне нужен способ указать, какой тип приходит откуда. –

+0

Не уверен, что я понимаю вашу озабоченность, но помните: переменная класса (здесь 'ctor') должна отображаться в каждой сигнатуре функции класса и должна применяться к правильному количеству аргументов типа. Следовательно, все типы фиксируются через входные данные. – Ingo

+0

Более простой вопрос: не могли бы вы дать явную подпись типа 'funct' внутри' instance C Pair where'? –

Смежные вопросы