簡體   English   中英

在typeclass實例中僅提及受約束的字段

[英]Mentioning just constrained fields inside instance of typeclass

你好,我想知道的是有有什么辦法type實現了一個typeclass把一個約束的一個字段而不分解所有類型?(或者干脆把沒有在實例聲明中列舉的所有其他領域?)

例:

data A=A | BB | CCC deriving( Show)

class T a where
  mymethod::a->Bool

instance T A where
 mymethod a = length . show $ a >1

data Complex b = Complex{
                  a::Int,
                  b::A,
                  c::String
                  }

instance (T b) => T (Complex a b c)  

在最后一行的上方看,有什么方法可以僅枚舉我們要施加約束的字段? (在我們的情況下, b實現T類型類)。
我們可以放wildcards或任何其他東西不放所有字段嗎?

例如
instance (T b) => T (Complex _ b _)
甚至更好

 instance (T b) => T Complex {b ? } 

在為A修復了mymethod的實現之后(您需要在>的第一個參數周圍加上括號),以下對我有用:

data Complex = Complex{
                  a::Int,
                  b::A,
                  c::String
                  }

instance T Complex where
    mymethod c = mymethod (b c)

我已將類型參數的類型刪除為Complex ,我懷疑您會感到困惑,並且認為沒有名稱時,名為b的類型與名稱為b的字段之間存在聯系。 如果需要,可以使該連接明確(在這里,我將使用不同的名稱來強調連接的方式,但是您可以在下面放下TyField ,並且仍然具有有效的代碼):

data Complex aTy bTy cTy = Complex
    { aField :: aTy
    , bField :: bTy
    , cField :: cTy
    }

instance T bTy => T (Complex aTy bTy cTy) where
    mymethod val = mymethod (bField val)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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