我(->)在学习"高级"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 ...扩展吗?或者它只是用于解释概念的理论概念,仅此而已?
最后,最后一个问题.是否(<-)存在双重概念?
->是函数类型的类型构造函数.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是从功能的类型Int来String.
(Int (->))是一种错误; 它试图申请Int到(->),但Int不带任何参数.
(->) e确实Functor适用于任何类型e(具有fmap = (.),即功能组合).它也是一个Applicative和Monad(相当于Reader).
所有这些都是标准的Haskell语法.不需要语言扩展.
<-在类型级别不存在.它是可以在表达式中使用的保留语法,例如在list comprehensions([ x * 2 | x <- [0 ..] ])或doblocks(do { x <- p; return (x * 2) })中; 它也用在其他一些环境中,但不是在类型中使用.
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |