haskell - 类型类数据类型

标签 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)

最佳答案

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

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

关于haskell - 类型类数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24350348/

相关文章:

haskell - 具有 Haskell 函数依赖性的不明确类型变量

haskell - 跨平台空句柄或忽略进程的输出

haskell - 为什么 eta 扩展会降低 fib 的性能?

function - 为什么 foldr 可以采用具有三个参数的函数?

go - 如何表达 "slice of (string or ' 其他此类 slice 的类型')"

haskell - 为什么我可以在没有显式或隐式定义的情况下使用 `>>=`?

scala - 对两种类型之间的二元关系建模

haskell - 在 Haskell 中将一个仿函数映射到另一个仿函数

haskell - 以下两个 lambda 函数的空间复杂度

java - 功能java : what's this P1 thing?