MultiParamTypeClasses 这个扩展只是为了方便一些, 还是有一些抽象必须用到? 如果是必须用到, 可以举个例子吗?
我看了一个例子, 概括一下就是这个意思(如果我没理解错的话):
有个描述集合的typeclass:
class Collection c where
insert :: c -> e -> c
member :: c -> e -> Bool
但是实际上, 只会对c e
这种类型实现; 并且需要对有约束Eq e
. 例如对[]
实现时就会报错:
instance Collection [a] where
-- insert :: [a] -> e -> [a]
insert xs x = x:xs -- Couldn't match type ‘e’ with ‘a’
-- member :: [a] -> e -> Bool
member = flip elem -- 报错同上. 而且 elem 需要 Eq 约束
而有了这个扩展就可以写成下面这样了:
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
class Eq e => Collection c e where
insert :: c -> e -> c
member :: c -> e -> Bool
instance Eq a => Collection [a] a where
insert = flip (:)
member = flip elem
但实际上不需要这个扩展也可以写:
class Collection c where
insert ::c e -> e -> c e
contains :: Eq e => c e -> e -> Bool
所以为什么要有 MultiParamTypeClasses 扩展呢?