所以我有這個類:
class Collection c where
empty :: c key value
singleton :: key -> value -> c key value
insert :: Ord key => key -> value -> c key value -> c key value
looKup :: Ord key => key -> c key value -> Maybe value
delete :: Ord key => key -> c key value -> c key value
keys :: c key value -> [key]
keys x = map fst $ toList x
values :: c key value -> [value]
values c = map snd $ toList c
toList :: c key value -> [(key, value)]
fromList :: Ord key => [(key,value)] -> c key value
fromList [] = empty
fromList ((k, v):xs) = insert k v (fromList xs)
為什么是這樣
instance Collection (PairList k v) where
一個糟糕的類實體,這個:
instance Collection PairList where
是好的嗎?我知道在制作 的實體時Eq,haskell 是這樣做的:
instance Eq (Maybe m) where
Just x == Just y = x == y
Nothing == Nothing = True
_ == _ = False
所以實體化接受引數......那么為什么第一個像這樣呢?
uj5u.com熱心網友回復:
根據c使用方式,Collection需要某種東西* -> * -> *。
> :k Collection
Collection :: (* -> * -> *) -> Constraint
PairList k v, 不過, 有種*.
Eq, 另一方面, 期待某種型別的東西*, 這正是Maybe m.
> :k Eq
Eq :: * -> Constraint
(Maybe本身有 kind * -> *,但將其應用于型別變數會產生 kind *。)
uj5u.com熱心網友回復:
您放在實體頭中的東西將在任何地方替換類變數。所以,如果我們結合
class Collection c where
empty :: c key value
-- and other stuff, too, of course
和
instance Collection (PairList k v)
我們得到型別
empty :: (PairList k v) key value
這沒有多大意義。但是如果我們將類宣告與
instance Collection PairList
然后我們得到型別
empty :: PairList key value
這很有意義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/417813.html
標籤:
