我正在阅读LYAH。它说我需要显式加载Control.Monad.Instances
以使以下语法起作用:
( ( fmap (+5) ) (+5) ) 4
为什么?为什么如果算子是这种基础和统一技术,我必须显式加载Control.Monad.Instances
来获得该功能。如何在没有它的情况下实现( - >)(或者只是隐藏并且只导出->
)?为什么不使用fmap
而不是默认实现的函数类型?
答案 0 :(得分:10)
这里涉及3个不同的概念。函数类型,Functor类型类和Functor“实例”。函数类型( - >)内置于语言中,其存在和实现与Functor和fmap完全无关。类型类是其关联方法的签名的规范。 “实例”是该签名的实现。
因此,为了使您的问题更加清晰,我会将其重新称为“为什么不是Prelude中提供的(>)Functor实例?” (Prelude是默认情况下在范围内的模块)。正如目前的措辞,它没有多大意义。
修改后问题的答案很简单:Haskell报告(官方语言规范,指定Prelude接口的地方)不包括它。可以说它应该是,但Haskell语言和库从那时起已经发展了很多,并且Haskell标准往往变化缓慢。无论如何,对或错,这就是原因。
答案 1 :(得分:2)
Functor不是一种语言特性,它只是一个随机模块碰巧定义的有用类型类。要使用该模块的Functor定义,您必须加载它,故事结束。