我可以在不污染術語級別命名空間的情況下為種類產品撰寫產品種類嗎?
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
data Pair a b = Pair a b
type family Proj1 (asd :: Pair a b) where
Proj1 ('Pair a b) = a
type family Proj2 (asd :: Pair a b) where
Proj2 ('Pair a b) = b
uj5u.com熱心網友回復:
好吧,你可以省略建構式:
data Pair a b
現在,Pair既是型別級產品:
x :: Pair a b
x = undefined
和善良的產品:
type family Proj1 (x :: Pair a b)
沒有關聯的術語級別Pair。
最終很難用它做很多事情。因為它作為一種型別是無人居住的(無術語),作為一種無人居住(無型別)。
我認為這就是@chepner 在評論中指出的。由于在 Haskell 中定義新型別的唯一方法是定義一個新型別并將其提升,因此在不影響術語級命名空間的情況下定義新型別的唯一方法是定義一個無人居住的新型別并將其提升為無人居住的種類.
請注意,一旦DataKinds啟用,種類級別的產品就會(,)自動出現,所以如果您擔心增加術語級別的命名空間污染,您可以使用它:
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeFamilies #-}
type family Proj1 (asd :: (a,b)) where
Proj1 '(a,b) = a
type family Proj2 (asd :: (a,b)) where
Proj2 '(a,b) = a
在 GHCi 中:
> :kind! Proj1 '(Int, String)
Proj1 '(Int,String) :: *
= Int
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/431380.html
標籤:哈斯克尔
上一篇:術語級別的種類的種類模式匹配
