[英]Understanding Haskell's (->)?
在学习“高级” Haskell时,我很少看到(->)
。 当我尝试运行:t (->)
时ghci
失败,以为有时甚至官方文档也使用此符号。
据我可以猜测 , (->)
是在一个Hask 任何态射-基本上,任何Haskell的功能。 我假设这个想法是要修复源端点或目标端点:例如, ((->) Int)
可能意味着Int
类型的任何函数; 显然, (Int (->))
表示Int
任何函数。
下一个假设是(->)
可能是endofunctor。 fmap
实现看似微不足道:具有类型为a
且定态为f :: a -> b
fmap
f :: a -> b
的固定终结点可以生成((->) b)
的实例。 它保留id
,但不会撕裂现有的合成:即fmap(g . f) = fmap(g) . fmap(f)
fmap(g . f) = fmap(g) . fmap(f)
。
所以我的第一个问题是:我说的对吗?
我的第二个问题是为什么:t (->)
在ghci
失败?
我的主要问题是,有没有一种方法可以在真实的Haskell代码中使用(->)
? 我是否需要启用一些{{ #Pragma ...
扩展名? 还是仅是用于解释概念的理论概念?
最后, 最后一个问题 。 是否存在对偶概念(<-)
?
->
是函数类型的类型构造函数。 f :: A -> B
表示“ f
是从某种类型A
到某种类型B
的函数”。
:t (->)
是错误,因为->
不是值,并且没有类型; 它是一个类型(或更确切地说是类型构造函数)。 同样, :t Maybe
和:t Int
是错误。
与普通运算符一样,中缀应用程序是(咖喱)前缀应用程序的语法糖; 即就像x + y
可以写成(+) xy
或((+) x) y
, A -> B
可以写成(->) AB
或((->) A) B
。
((->) Int)
并不意味着“ Int
类型的任何函数”; 它是从功能类型构造Int
。 它本身不是有效的类型,但是您可以将其应用于类型以获得有效的函数类型。 例如((->) Int) String
是从Int
到String
的函数类型。
(Int (->))
是一种错误; 它尝试将Int
应用于(->)
,但Int
不接受任何参数。
(->) e
实际上是任何类型e
的Functor
(具有fmap = (.)
,即函数组合)。 它也是一个Applicative
和Monad
(相当于Reader
)。
所有这些都是标准的Haskell语法。 不需要语言扩展。
<-
在类型级别不存在。 这是保留的语法,可以在表达式中使用,例如在列表推导( [ x * 2 | x <- [0 ..] ]
)或do
块中( do { x <- p; return (x * 2) }
) ; 它还在其他一些上下文中使用,但不在类型中使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.