讓我們定義一個collapse
功能坍塌任何可能嵌套Maybe (Maybe (... a)...)
到Maybe a
:爲什麼這些情況下不會產生重疊實例錯誤
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE IncoherentInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NoOverlappingInstances #-}
{-# LANGUAGE TypeFamilies #-}
module MaybeCollapsable where
class M a b where
collapse :: Maybe a -> Maybe b
instance (a ~ b) => M a b where
collapse = id
instance M a b => M (Maybe a) b where
collapse Nothing = Nothing
collapse (Just a) = collapse a
它運作良好
> collapse (Just (Just (Just 1)))
Just 1
雖然,這很奇怪。這兩種情況似乎都可以匹配該特定情況(a ~ Maybe x
和b ~ Maybe x
),但編譯器不會產生Overlapping Instances
錯誤。如何使用-XNoOverlappingInstances
?
順便說一句,它是一種安全可用的方法來定義這種方法崩潰嵌套Maybe
?