2011-04-09 74 views

回答

6

它不一定是安全的或哈斯克尔-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 
+0

在我的情况下也需要{ - #语言IncoherentInstances# - },但这是我的问题的答案。谢谢! – Tener 2011-04-09 19:58:18

+0

嗨唐 - 特定实例如何被选择? GHC是否总是决定使用最具体的实例,特别是在存在单独的模块的情况下?在一个月或两个月前,Haskell Cafe上有一篇关于此的文章,但没有人提供了答案。 – 2011-04-09 19:58:19

+1

根据文档:“-XOverlappingInstances标志指示GHC允许多个实例匹配,只要有一个最特定的实例即可,如果没有最具体的匹配,程序将被拒绝。” – 2011-04-09 20:04:11