Haskell 为什么不是';默认情况下,使用Control.Monad.Instances实现t(->;)

Haskell 为什么不是';默认情况下,使用Control.Monad.Instances实现t(->;),haskell,monads,functor,Haskell,Monads,Functor,我在看书。它说我需要显式加载Control.Monad.Instances,以使用以下语法: ( ( fmap (+5) ) (+5) ) 4 为什么呢?为什么如果functor是这种底层的统一技术,我必须显式加载Control.Monad.Instances才能获得该功能。在没有它的情况下(->)是如何实现的(或者只是隐藏并且只导出了->?为什么默认情况下不在函数类型上使用fmap?Functor不是一种语言特性,它只是一个随机模块碰巧定义的有用类型类。要使用该模块的函子定义,您必须加载它,

我在看书。它说我需要显式加载
Control.Monad.Instances
,以使用以下语法:

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

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

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

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

为了让你的问题更清楚,我想把它改成“为什么序曲中没有提供(->)的函子实例?”(序曲是默认范围内的模块)。按照目前的措辞,它没有多大意义

修改后的问题的答案很简单:Haskell报告(官方语言规范,即Prelude接口的指定位置)没有包含它。可以说是应该的,但是Haskell语言和库从那时起已经有了很大的发展,Haskell标准的变化也很缓慢。不管是对是错,这就是原因。

另请参见