[英]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
的字段之間存在聯系。 如果需要,可以使該連接明確(在這里,我將使用不同的名稱來強調連接的方式,但是您可以在下面放下Ty
和Field
,並且仍然具有有效的代碼):
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.