5

我在读LYAH。它说我需要显式加载Control.Monad.Instances才能使以下语法起作用:

( ( fmap (+5) ) (+5) ) 4

这是为什么?为什么如果函子是这种底层和统一的技术,我必须显式加载Control.Monad.Instances才能获得该功能。没有它(->)如何实现(或者只是隐藏并且只->导出)?为什么fmap默认情况下不使用 over 函数类型?

4

2 回答 2

10

这里涉及 3 个不同的概念。函数类型、Functor 类型类和 Functor“实例”。函数类型 (->) 是语言内置的,它的存在和实现与 Functor 和 fmap 完全无关。类型类是其关联方法的签名规范。“实例”是该签名的实现。

因此,为了使您的问题更清楚,我将其重新表述为“为什么 Prelude 中没有提供 (->) 的 Functor 实例?” (Prelude 是默认范围内的模块)。按照目前的说法,它没有多大意义。

修改后的问题的答案很简单:Haskell 报告(官方语言规范,指定 Prelude 的界面)不包括它。可以说它应该,但从那时起,Haskell 语言和库已经发展了很多,而且 Haskell 标准往往变化缓慢。无论如何,对或错,这就是原因。

于 2010-11-18T13:58:44.227 回答
2

Functor 不是一种语言特性,它只是一个随机模块碰巧定义的有用类型类。要使用该模块的 Functor 定义,您必须加载它,故事结束。

于 2010-11-18T03:34:25.250 回答