阅读文章 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)
最佳答案
这不适用于 GHC 7.8.2。它给出了错误 Expected a constraint, but ‘IFunctor f’ has kind ‘*’
.
旧版本的 GHC 存在允许 =>
的错误。像 ->
一样使用在某些情况下。这可能是因为内部类型类约束以方法字典的形式作为参数传递。
关于haskell - 类型类数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24350348/