繁体   English   中英

Functor的fmap可以说明什么类型?

[英]What does Functor's fmap tell about types?

fafb告诉我有关类型的信息吗?

class Functor f where
  fmap :: (a -> b) -> f a -> f b

我想我是在函子的标准实例背后得到了这个想法。 但是,我很难理解faf实际代表什么。

我知道fafb只是类型,它们必须携带信息使用什么类型构造函数来创建它们以及使用的类型参数。

f是类型* -> *的类型构造函数吗? (->) r是否像Maybe一样是类型构造函数?

我知道fa和fb只是类型,它们必须携带信息使用什么类型构造函数来创建它们以及使用的类型参数。

很好的解释。

f是类型* -> *的类型构造函数吗?

有效。

(->) r是否像Maybe一样是类型构造函数?

实际上,是的:

是的,您可以将其应用于String类的类型并获取r -> String ,就像您可以将Maybe应用于String以获取Maybe String 您可以使用f任何东西,让你从任何其他类型的类型。

..但不是...

不,就丹尼尔·瓦格纳指出的意义而言; 确切地说, Maybe[]是类型构造函数,但(->) rEither a类似于部分应用的类型构造函数。 尽管如此,它们还是很好的函子,因为您可以在函数“内部”自由应用函数并更改“内容”的类型。

(倒置逗号中的内容是非常手工的不精确术语。)

我的(可能是温和的折磨)阅读Haskell的2010报告的第四章Maybe(->) r是两种类型 ,一种* -> * 另外,报告也将它们标记为类型表达式 -但是我无法辨别报告使用这两个术语的方式有什么明显的区别,也许只是表面语法细节。 (->)Maybe是类型构造函数; 类型表达式由类型构造函数和类型变量组装而成。

例如,2010年报告的第4.1.1节(“种类”)说(我的黑体字):

为了确保它们有效,类型表达式被分为不同的种类 ,采用两种可能的形式之一:

  • 符号∗表示所有空类型构造函数的种类。
  • 如果κ1和κ2是种,然后κ1→κ2是那种认为采取那种类型的κ1并返回一个类型一种κ2的类型

第4.3.2节“实例声明”(我的黑体字):

一个instance声明,使类型 T是类C的一个实例被称为CT实例声明并受这些静态限制:

  • 在程序中,一个类型不能多次声明为特定类的实例。
  • 类和类型必须具有相同的种类。 可以使用第4.6节中所述的种类推断来确定。

因此,按照这种语言,以下instance声明使类型 (->) r成为Functor类的实例:

instance Functor ((->) r) where
    fmap f g = f . g

关于此术语的有趣之处在于,即使Haskell中没有具有该类型的表达式,甚至undefined ,我们仍将(->) r称为“类型”:

foo :: (->) r
foo = undefined

{-
[1 of 1] Compiling Main             ( ../src/scratch.hs, interpreted )

../src/scratch.hs:1:8:
    Expecting one more argument to `(->) r'
    In the type signature for `foo': foo :: (->) r
-}

但是我认为这没什么大不了的。 基本上,Haskell中的所有声明都必须具有类型*类型。

附带说明一下,由于我对依存类型语言的有限了解,许多语言都缺乏Haskell在术语和类型之间的明确区分,因此(->) Boolean的表达式是其值是一个以类型为参数的函数的表达式。并产生一个结果类型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM