我希望有一个类型的类型,如果可能的话可能会转换为其他类型。
class Castable a b where
cast :: a -> Maybe b
cast _ = Nothing -- default implementation
现在该类将针对某些类型实现,而所有实现其他我想要默认实现的类。
如何做到这一点?
答案 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