Экземпляр Typeclass с функциональными зависимостями не работает

Играя с классами типов, я придумал, казалось бы, невинный

class Pair p a | p -> a where
  one :: p -> a
  two :: p -> a

Кажется, это нормально работает, например

instance Pair [a] a where
  one [x,_] = x
  two [_,y] = y 

Однако у меня проблемы с кортежами. Несмотря на то, что следующее определение компилируется ...

instance Pair (a,a) a where
  one p = fst p 
  two p = snd p

... Я не могу использовать его, как я ожидал:

main = print $ two (3, 4)

No instance for (Pair (t, t1) a)
  arising from a use of `two' at src\Main.hs:593:15-23
Possible fix: add an instance declaration for (Pair (t, t1) a)
In the second argument of `($)', namely `two (3, 4)'
In the expression: print $ two (3, 4)
In the definition of `main': main = print $ two (3, 4)

Есть ли способ правильно определить экземпляр? Или мне нужно использовать оболочку newtype ?

11
задан Landei 16 December 2011 в 15:41
поделиться