[英]Forall constraints
如何編寫forall
約束,例如對於某些類型的族F
和G
:
forall x y. G (F x y) ~ (x, y)
是否可以使用Edward A. Kmett Constraints
包? 如果是這樣,可以提供一個小例子嗎? 我認為我需要使用Forall
。
是的,這可以使用constraints
。 但要小心! 如果類型族是非平凡的,那么你所聲稱的平等不可能具有足夠的constraints
一般性。 特別考慮當x
和y
是卡住類型族時類型族是否成功減少
type family X where {}
type family Y where {}
另外,我看到你特定的期望約束沒有任何自由變量。 希望這只是一個例子; 像這樣的實際封閉約束不太可能有用。
Data.Constraint.Forall
的基本類型族是Forall
。 使用ForallT
可以更方便地處理這個特定的例子,但了解如何使用Forall
是最重要的。
通常, Forall p
表示forall x . px
forall x . px
。 這聽起來不是很一般,但實際上,如果你逐步建立你的p
。 你追求
forall x y. G (F x y) ~ (x, y)
首先定義一個表達您尋求的關系的類。
class G (F x y) ~ (x, y) => C x y
instance G (F x y) ~ (x, y) => C x y
現在你可以一步一步地定義
class Forall (C x) => D x
instance Forall (C x) => D x
(你可以讀作D x = forall y . C xy
)
然后使用Forall D
(即forall x . D x
Forall D
forall x . D x
)來表達你的約束。 你需要使用inst
來獲得Dict (D x)
並再次獲得Dict (C xy)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.