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)
Это легко сделать, определив два экземпляра для преобразования, идущего в любом направлении, но я бы хотел объявить только один, как в первом пример. Есть идеи, как я могу это сделать?
Изменить: Под осуществимым я имею в виду, можно ли это сделать без перекрытия экземпляров любых других неприятных расширений?