首页 > 解决方案 > 了解 Haskell 的 (->)?

问题描述

(->)我在学习“高级”Haskell 时 见过几次。ghci当我尝试运行时失败:t (->),有时甚至官方文档也会使用这种表示法。

据我猜测(->)Hask中的任何态射- 基本上,任何 Haskell 函数。我假设这个想法是修复源端点或目标端点:例如,可能意味着该类型的任何函数;显然,意味着来自.((->) Int)Int(Int (->))Int

下一个假设是它(->)可能是一个内函子。fmap实现似乎很简单:拥有一个固定的类型a和态射端点,f :: a -> b可以生成((->) b). 它保留id但不会撕裂现有的作品:即fmap(g . f) = fmap(g) . fmap(f).

所以我的第一个问题是:我说的对吗?

我的第二个问题是为什么然后:t (->)失败了ghci

我的第三个问题是有一种方法可以(->)在真正的 Haskell 代码中使用吗?我需要启用一些{{ #Pragma ...扩展吗?或者它只是一个用于解释概念的理论概念,仅此而已?

最后,最后一个问题。是否存在双重概念(<-)

标签: haskell

解决方案


->是函数类型的类型构造函数。f :: A -> B表示“f是从某种类型A到某种类型的函数B”。

:t (->)是一个错误,因为->它不是一个值并且没有类型;它是一个类型(或者更确切地说是类型构造函数)。同样,:t Maybe:t Int都是错误。

与普通运算符一样,中缀应用程序是(咖喱)前缀应用程序的语法糖;即x + y可以写成(+) x yor ((+) x) y,也A -> B可以写成(->) A Bor ((->) A) B

((->) Int)并不意味着“该Int类型的任何功能”;它是函数的类型构造函数 Int它本身不是有效类型,但您可以将其应用于类型以获得有效的函数类型;eg((->) Int) String是从Int到的函数类型String

(Int (->))是一种错误;它试图应用于Int(->)Int不接受任何参数。

(->) e确实是Functor适用于任何类型e(带有fmap = (.),即函数组合)。它也是一个Applicative和一个Monad(它相当于Reader)。

所有这些都是标准的 Haskell 语法。不需要语言扩展。

<-在类型级别不存在。它是可以在表达式中使用的保留语法,例如在列表推导式 ( [ x * 2 | x <- [0 ..] ]) 或do块 ( do { x <- p; return (x * 2) }) 中;它也用于其他一些上下文,但不在类型中。


推荐阅读