了解Haskell的( - >)?

Ser*_*bov 1 haskell

(->)在学习"高级"Haskell的过程中几次看到. ghci当我试图跑步时失败:t (->),有时甚至认为官方文档使用这种表示法.

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

接下来的假设是(->)可能是一个endofunctor.fmap实现看起来非常简单:拥有类型a和态射的固定端点,f :: a -> b可以生成一个实例((->) b).它保留id并且不会破坏现有的组合物:即fmap(g . f) = fmap(g) . fmap(f).

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

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

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

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

mel*_*ene 6

->是函数类型的类型构造函数.f :: A -> B意思是" f是从某种类型A到某种类型的函数B".

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

与普通运算符一样,中缀应用程序是(curried)前缀应用程序的语法糖; 也就是说x + y可以写,(+) x y或者((+) x) y可以A -> B(->) A B((->) A) B.

((->) Int)并不意味着"任何Int类型的功能"; 它是功能型的构造 Int.它本身不是有效类型,但您可以将其应用于类型以获取有效的函数类型; 例如((->) Int) String是从功能的类型IntString.

(Int (->))是一种错误; 它试图申请Int(->),但Int不带任何参数.

(->) e确实Functor适用于任何类型e(具有fmap = (.),即功能组合).它也是一个ApplicativeMonad(相当于Reader).

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

<-在类型级别不存在.它是可以在表达式中使用的保留语法,例如在list comprehensions([ x * 2 | x <- [0 ..] ])或doblocks(do { x <- p; return (x * 2) })中; 它也用在其他一些环境中,但不是在类型中使用.