[英]What does Functor's fmap tell about types?
fa
和fb
告诉我有关类型的信息吗?
class Functor f where
fmap :: (a -> b) -> f a -> f b
我想我是在函子的标准实例背后得到了这个想法。 但是,我很难理解fa
和f
实际代表什么。
我知道fa
和fb
只是类型,它们必须携带信息使用什么类型构造函数来创建它们以及使用的类型参数。
f
是类型* -> *
的类型构造函数吗? 是(->) r
是否像Maybe
一样是类型构造函数?
我知道fa和fb只是类型,它们必须携带信息使用什么类型构造函数来创建它们以及使用的类型参数。
很好的解释。
f
是类型* -> *
的类型构造函数吗?
有效。
是
(->) r
是否像Maybe一样是类型构造函数?
实际上,是的:
是的,您可以将其应用于String
类的类型并获取r -> String
,就像您可以将Maybe
应用于String
以获取Maybe String
。 您可以使用f
任何东西,让你从任何其他类型的类型。
..但不是...
不,就丹尼尔·瓦格纳指出的意义而言; 确切地说, Maybe
和[]
是类型构造函数,但(->) r
和Either 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.