haskell - 了解 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 ...
扩展吗?或者它只是一个用于解释概念的理论概念,仅此而已?
最后,最后一个问题。是否存在双重概念(<-)
?
解决方案
->
是函数类型的类型构造函数。f :: A -> B
表示“f
是从某种类型A
到某种类型的函数B
”。
:t (->)
是一个错误,因为->
它不是一个值并且没有类型;它是一个类型(或者更确切地说是类型构造函数)。同样,:t Maybe
和:t Int
都是错误。
与普通运算符一样,中缀应用程序是(咖喱)前缀应用程序的语法糖;即x + y
可以写成(+) x y
or ((+) x) y
,也A -> B
可以写成(->) A B
or ((->) 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) }
) 中;它也用于其他一些上下文,但不在类型中。
推荐阅读
- charts - 使用时间戳时 APEX 图表不显示任何内容
- javascript - TS2307:在 Angular 中找不到错误模块本地 geojson
- bogus - Bogus 中的固定长度数字字符串
- vue.js - Vue i18n:根据服务器返回的密钥转换消息
- c# - 如何从所有成员的生日中获取 Day 并在另一个 dataGrid 列上显示 Day BirthDay Due,例如。周三、周四等
- sql - SQL XML 返回所有元素值
- javascript - ReactJS 中的 Google 图表仪表板
- haskell - 最新的 Haskell 安装后,Cabal 不存在
- angular - Angular 8 UI observable 未触发更改检测 - ChangeDetectionStrategy 设置为默认值
- javascript - 如何使用javascript递归地将多个子属性总结为TreeTable中的父属性