[英]creating instances of classes haskell
所以我有这个 class:
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
class 的错误实例,这是:
instance Collection PairList where
是好的吗? 我知道在制作Eq
的实例时,这就是 haskell 的做法:
instance Eq (Maybe m) where
Just x == Just y = x == y
Nothing == Nothing = True
_ == _ = False
所以实例化接受参数......那么为什么第一个像这样呢?
根据c
的使用方式, Collection
需要类似* -> * -> *
的东西。
> :k Collection
Collection :: (* -> * -> *) -> Constraint
但是, PairList kv
有一种*
。
另一方面, Eq
期望某种类型的*
,这正是Maybe m
的样子。
> :k Eq
Eq :: * -> Constraint
( Maybe
它本身有一种* -> *
,但将它应用于类型变量会产生某种*
。)
您放入实例头中的内容将在各处替换 class 变量。 所以,如果我们结合
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
这没有多大意义。 但是如果我们将 class 声明与
instance Collection PairList
然后我们得到类型
empty :: PairList key value
这很有意义。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.