[英]Specialize class instance in PureScript
說我有以下類型:
newtype T1 a = T1 a
我可以為其創建一個Show
實例:
instance showT1Generic :: Show a => Show (T1 a) where
show (T1 a) = "generic: " <> show a
但是,假設我想對T1 Int
類型做一些特殊的事情。 我嘗試這樣做:
instance showT1Int :: Show (T1 Int) where
show (T1 a) = "int: " <> show a
並且可以編譯,但是在psci
中運行無法按預期運行:
> T1 'a'
generic: 'a'
> T1 1
generic: 1
我做錯了嗎?
定義這兩個實例將引發OverlappingInstances
警告,這是您在這里發現的原因-它會使選定的實例不可預測。
我認為,如果您翻轉實例定義的順序,則可以使用,但實際上不建議您忽略OverlappingInstances
警告。
您實際上不能做您想在這里做的事情-您可以使用新類型更改實例的行為,但是專門針對某些具體類型的實例並具有通用后備總是會導致實例重疊。 也許如果我們引入實例鏈,這將成為可能,但是在那之前,最好還是使用單態函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.