Это не обязательно безопасный или 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