haskell - 为什么要为像 'nameless' 这样的 `(->) e` 类型定义一个仿函数实例

标签 haskell types

在 Haskell 中 GHC base具有类型 (->) r 的 Functor 实例的定义:

instance Functor ((->) r) where
    fmap = (.)
Typeclassopedia解释 ((->) e)是将 e 类型的值作为参数的函数类型。这是有道理的,但我不知道如何 (->) e较晚使用,相较于 Maybe , Either a , 甚至 [] .
我想我理解这些仿函数定义,它们被命名为:Maybe , Either a ,但我很难理解“无名”类型 (->) r用来。
这是否意味着我需要怀疑任何其他 a ->在每个类型签名中作为仿函数?这是一种定义箭头属性的方法 ->在 haskell ?
这是否与类型签名中的箭头或来自 lambda 函数的箭头相同?我尝试在 Haskell 报告中查找,但有 ->用于文档的自己的符号,所以没有运气。
提前感谢任何可以帮助打破僵局的提示 (->) r .
更新:根据评论,我想我应该问哪里 ->类型构造函数定义?它是内置的吗?
答案是->是内置的,它是一个 "function arrow" or "function type constructor" .

最佳答案

(->) r不是无名类型。它的名字是 (->) ,就像 Either是一个名字。事实上,如果你写 a -> b , 你写了 (->) a b .或者如果你写 a -> b -> c ,则规范形式为 (->) a ((->) b c) .(->)是一个类型构造函数,就像 Maybe , Either等。事实上,它被用作中缀运算符并不奇怪。如果你写 x : xs例如,那么规范形式是 (:) x xs (或更详细地说 ((:) x) xs )。如果您启用 TypeOperators扩展,你甚至可以写类型像 Left 1 :: Int `Either` String .

关于haskell - 为什么要为像 'nameless' 这样的 `(->) e` 类型定义一个仿函数实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63215654/

相关文章:

haskell - Haddock:用推断的类型签名记录声明?

haskell - 数据种类联盟

api - Haskell:节目搞砸了?

c++ - std::variant 与 std::any 当类型可移动构造时

C++ - 将类型映射到枚举

java - Java中如何判断一个Type是否实现了某个接口(interface)?

haskell - 如何在 Haskell 中搜索库版本?

haskell - Church 风格的核心中缺少类型变量会怎样?

scala - 类型类参数的 ClassTag

java - 如何将用户定义的数据类型中的值插入到java中的对象中?