如何为某些类型创建专用类型类,其余类型的默认实现

时间:2011-04-09 19:39:11

标签: haskell types typeclass

我希望有一个类型的类型,如果可能的话可能会转换为其他类型。

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

现在该类将针对某些类型实现,而所有实现其他我想要默认实现的类。

如何做到这一点?

1 个答案:

答案 0 :(得分:6)

这不一定是安全或Haskell-y的事情,但肯定可以,使用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