簡體   English   中英

在PureScript中專門化類實例

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM