繁体   English   中英

创建类 haskell 的实例

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM