2011-04-09 68 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