题
我正在使用GHCi(版本6.12.3)与Haskell一起玩。我最近阅读了有关函子和应用函子的文章,他们认为,如果不能仅使用函子的原语来实现类似于应用函子的基因标记代码的某些东西。经过一番思考,我想出了<*>
,它将具有(几乎)理想的类型
fmap fmap
或更笼统地
Functor f => f (a -> b) -> f (f a -> f b)
我尝试过 通用标签
我遇到以下错误 通用标签
按照建议写上述类型签名无济于事。
最疯狂的是,当我键入(Functor f1, Functor f2) => f1 (a -> b) -> f1 (f2 a -> f2 b)
时,得到了与上述相同的类型。
我在做什么错?尽管GHCi为它找到了类型,但为什么:t fmap fmap
却给出类型错误?
解决方案
好像您遇到了同构限制。
使用-XNoMonomorphismRestriction
在GHCi中尝试示例将获得预期的结果。
您还可以通过编写let f x = fmap fmap $ x
来颠覆这一点。单态性限制仅适用于“看起来像”值的顶级定义,即f = something
,因此引入显式自变量导致其不再适用。如果它不在顶层(例如,在where
子句中),那么它也将不适用。有关更多详细信息,请参见链接。
其他提示
我无法在所有地方发表评论,因此我将发布答案。如前所述,您收到的错误是由于单态性限制所致。将类型签名固定为原始问题中给出的两个签名确实确实使ghci像您希望的那样高兴,也许您只是语法有点错误? 通用标签
不隶属于 StackOverflow