Haskell中(->)是什么?它构造什么类型?是否存在值构造器?
关于Haskell中
(->)类型构造器的疑问 在GHCi中输入:i (->)并按下Enter,会返回以下内容:
data (->) t1 t2 -- Defined in ‘GHC.Prim’ infixr 0 `(->)` instance Monad ((->) r) – Defined in ‘GHC.Base’ instance Functor ((->) r) – Defined in ‘GHC.Base’ instance Applicative ((->) a) – Defined in ‘GHC.Base’ instance Monoid b => Monoid (a -> b) – Defined in ‘GHC.Base’
从data关键字可知它是一种类型构造器,但它具体构造什么类型?如果存在值构造器的话,值构造器又是什么?
这个疑问源于我了解到函数属于Functor类型类,在:i Functor命令返回的类型类描述中被列为((->) r)。我尝试查询((->) r)的信息但没有结果,之后在Functor类型类描述中看到(Either a)(可通过:i Either查询其描述,无需带参数),才意识到应该尝试查询:i (->),并得到了上述信息。
核心解答
(->)构造的类型(->)是Haskell内置的函数类型构造器,它接受两个类型参数t1和t2,构造出的就是「从t1类型到t2类型的函数类型」。我们平时写的a -> b其实就是(->) a b的中缀语法糖,两者完全等价。值构造器的情况
(->)作为特殊的内置类型构造器,没有显式的、用户可见的值构造器。函数本身就是该类型的值,我们通过以下方式直接创建函数值:- lambda表达式:
\x -> x + 1 - 具名函数定义:
addOne x = x + 1 - 运算符部分应用:
(+1)
这些都是(->) t1 t2类型的实例值。
- lambda表达式:
关于
((->) r)作为Functor实例
当我们对(->)做部分应用(只传入第一个类型参数r),得到的((->) r)是一个接受单一类型参数的构造器,对应「输入类型为r的函数」这类类型。它的Functor实例实现本质是函数组合:
fmap :: (a -> b) -> (r -> a) -> (r -> b) fmap f g = f . g
也就是把函数g的输出传给f,得到一个新的从r到b的函数。
- 补充:
infixr 0的含义
输出里的infixr 0(->)表示(->)是右结合的运算符,优先级为0。这也是为什么我们写a -> b -> c会被解析成a -> (b -> c)`——函数默认是柯里化的。
内容的提问来源于stack exchange,提问作者Skab
相关产品推荐
相关产品推荐

