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