键入类数据类型

时间:2014-06-22 10:30:18

标签: haskell types typeclass

阅读文章Scrap your type classes后,我重新实施了一些显示的想法。 虽然这样做我遇到了一些非常奇怪的东西:Type Class - Type可以用作类型约束!我的问题:为什么?

我的代码:

{-# LANGUAGE Rank2Types #-}

data IFunctor f = IFunctor { 
    _fmap :: forall a b. (a -> b) -> f a -> f b 
}

-- this type checks...
_fmap2 :: IFunctor f => (a -> b) -> f (f a) ->  f (f b)
_fmap2 = \inst -> _fmap inst . _fmap inst

在GHCi中,会发生以下情况:

>>> :t _fmap2 :: IFunctor f => (a -> b) -> f (f a) -> f (f b)
_fmap2 :: IFunctor f => (a -> b) -> f (f a) -> f (f b)
       :: IFunctor f -> (a -> b) -> f (f a) -> f (f b)

1 个答案:

答案 0 :(得分:1)

这不适用于GHC 7.8.2。它给出了错误Expected a constraint, but ‘IFunctor f’ has kind ‘*’

旧版本的GHC有一个错误,他们允许=>在某些情况下像->一样使用。这可能是因为内部类型类约束以方法词典的形式作为参数传递。