【发布时间】:2018-12-15 05:01:25
【问题描述】:
在学习“高级”Haskell 时,我有几次看到(->)。
当我尝试运行:t (->) 时,ghci 失败,有时甚至官方文档也会使用这种表示法。
据我所知猜测,(->) 是 Hask 中的任何态射 - 基本上,任何 Haskell 函数。我假设这个想法是修复源端点或目标端点:例如,((->) Int) 可能意味着Int 类型的任何函数;显然,(Int (->)) 表示来自Int 的任何函数。
下一个假设是(->) 可能是一个内函子。 fmap 的实现似乎很简单:拥有a 类型的固定端点和态射f :: a -> b 可以生成((->) b) 的实例。它保留了id,但不会破坏现有的组合:即fmap(g . f) = fmap(g) . fmap(f)。
所以我的第一个问题是:我说的对吗?
我的第二个问题是为什么:t (->) 在ghci 中失败了?
我的第三个问题有没有办法可以在真正的 Haskell 代码中使用 (->)?我需要启用一些{{ #Pragma ... 扩展吗?或者它只是一个用来解释概念的理论概念,仅此而已?
最后,最后一个问题。双重概念(<-) 存在吗?
【问题讨论】:
-
看来这里有一些帮助:stackoverflow.com/q/9136421
-
(->)不是一个值,所以你不能询问它的类型。但是,您可以询问它的种类:k (->)或只是有关它的信息:i (->)。((->) Int)表示 来自Int类型的任何函数 - 想想((/) 2.0)和(/ 2.0)之间的类似区别。 -
@Alec,确实,谢谢。
标签: haskell