Haskell 的 MultiParamTypeClasses 扩展是必须的吗?

新手上路,请多包涵

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 扩展呢?

阅读 1.1k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进