3
我希望有一个类型类可以在可能时转换为其他类型。如何为某些类型制作专门的类型类,其余类型的默认实现
class Castable a b where
cast :: a -> Maybe b
cast _ = Nothing -- default implementation
现在的类将某些类型的实现和所有其他人我想有默认的实现。
如何做到这一点?
我希望有一个类型类可以在可能时转换为其他类型。如何为某些类型制作专门的类型类,其余类型的默认实现
class Castable a b where
cast :: a -> Maybe b
cast _ = Nothing -- default implementation
现在的类将某些类型的实现和所有其他人我想有默认的实现。
如何做到这一点?
它不一定是安全的或哈斯克尔-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
在我的情况下也需要{ - #语言IncoherentInstances# - },但这是我的问题的答案。谢谢! – Tener 2011-04-09 19:58:18
嗨唐 - 特定实例如何被选择? GHC是否总是决定使用最具体的实例,特别是在存在单独的模块的情况下?在一个月或两个月前,Haskell Cafe上有一篇关于此的文章,但没有人提供了答案。 – 2011-04-09 19:58:19
根据文档:“-XOverlappingInstances标志指示GHC允许多个实例匹配,只要有一个最特定的实例即可,如果没有最具体的匹配,程序将被拒绝。” – 2011-04-09 20:04:11