Как сделать специализированные классы типов для определенных типов, реализация по умолчанию для остальных типов - PullRequest
3 голосов
/ 09 апреля 2011

Я хотел бы иметь класс типов, которые могут быть преобразованы в другие типы, когда это возможно.

class Castable a b where  
    cast :: a -> Maybe b  
    cast _ = Nothing -- default implementation  

Теперь класс будет реализован для некоторых типов и для всех других, для которых я хотел бы иметь реализацию по умолчанию.

Как можно это сделать?

1 Ответ

6 голосов
/ 09 апреля 2011

Это не обязательно безопасный или Haskell-ы, но это, безусловно, возможно, используя OverlappingInstances

Сначала включите их:

{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE OverlappingInstances  #-}

Напишите свой класс кастинга:

class Castable a b where  
    cast :: a -> Maybe b  
    cast _ = Nothing -- default implementation  

«Оптимизированный» экземпляр:

instance Castable Int Bool where
        cast 0 = Just False
        cast _ = Just True

и, наконец, общий экземпляр для всех типов:

instance Castable a b where

Пример использования:

main = do
    print $ (cast (7 :: Int) :: Maybe Bool)
    print $ (cast (7 :: Int) :: Maybe Integer)

При выполнении этого по умолчанию выбирается, когда типы не являются специализированными:

*Main> main
Just True
Nothing
...