Общий класс типа преобразования

I ' Я хотел бы посмотреть, возможно ли иметь класс типа для преобразования одного объекта в другой и обратно из отображения [(a, b)] .

Этот пример должен проиллюстрировать то, что я ' хочу сделать:

data XX = One | Two | Three deriving (Show, Eq)
data YY = Eno | Owt | Eerht deriving (Show, Eq)

instance Convert XX YY where
   mapping = [(One, Eno), (Two, Owt), (Three, Eerht)]

-- // How can I make this work?:
main = do print $ (convert One :: YY) -- Want to output: Eno
          print $ (convert Owt :: XX) -- Want to output: Two

Вот мой укол в этой работе:

{-# LANGUAGE MultiParamTypeClasses #-}    
import Data.Maybe(fromJust)

lk = flip lookup
flipPair = uncurry $ flip (,)

class (Eq a, Eq b) => Convert a b where

   mapping :: [(a, b)]
   mapping = error "No mapping defined"

   convert :: a -> b
   convert = fromJust . lk mapping

-- // This won't work:
instance (Convert a b) => Convert b a where
   convert = fromJust . lk (map flipPair mapping)

Это легко сделать, определив два экземпляра для преобразования, идущего в любом направлении, но я бы хотел объявить только один, как в первом пример. Есть идеи, как я могу это сделать?


Изменить: Под осуществимым я имею в виду, можно ли это сделать без перекрытия экземпляров любых других неприятных расширений?

5
задан Ollie Saunders 24 October 2010 в 10:16
поделиться