简介:
我明白之间的差别Maybe a
和Maybe Int
,我也明白之间的差别Either a b
和Either Int Int
.我也明白,它Either Int
是同一种动物Maybe
,它们都将一个类型作为参数并生成一个新类型,即它们都是类型构造函数,它们将单个类型作为参数(具体如Int或具体不具体a
)和生产具体类型或多态类型.
现在我不明白的是什么样的结构Either a
?它不是Maybe
因为如果我们Int
向它提供具体类型(如),它永远不会产生具体的(读取非多态)类型.那么在这种情况下调用Either a
多态类型构造函数并调用Maybe
具体类型构造函数是正确的吗?(这就是我如何称呼它们,它们在Haskell命名法中的正式名称是什么?)
此外,我不知道类型构造函数的Haskell类型系统中的官方分类是什么样的,Either a
因为它不能与Maybe
因为 - 如前一段中所提到的 - 在同一类别中- 无论我们应用什么类型Either a
的结果type永远不会是具体类型,例如,它总是一个多态类型Either a Int
.
我问这个的原因是因为Either a
是Functor
.这开始变得令人困惑.没有像我以前见过的任何东西.我不知道我应该如何从概念上解释Either a
(多态类型构造函数)是一个实例Functor
?同样地,(->) r
(也是同一种动物Either a
)也是Functor
如此.
问题:
什么是Either a
和(->) r
?
他们正式称什么?
它们如何在概念上适合Haskell的类型系统?
这些多态类型构造函数在哪里更详细地描述/讨论?
我读到了什么,以便更好地了解它们?
我应该读一下种类吗?是种对理解这样的多晶型构造的秘密方式Either a
和(->) r
?
是Either a Int
同一种动物[a]
吗?
是唯一的目的Either a Int
在的情况下申报的多态的输入和输出类型的功能,就像[a]
在fmap :: (a -> b) -> [a] -> [b]
?
最重要的问题:
我应该如何根据上述想法解释以下代码?
instance Functor (Either a) where fmap f (Right x) = Right (f x) fmap f (Left x) = Left x class Functor f where fmap :: (a -> b) -> f a -> f b
那么结果fmap
函数(其类型是fmap :: (a -> b) -> Either c a -> Either c b
)将是多态的c
?
这是制作Either a
实例的唯一效果Functor
吗?那么结果fmap
函数会是多态的c
吗?
与之相比,例如,制作Either Int
一个实例Functor
?
那么结果fmap
只能在Either Int a
类型上起作用,但在所有Either a b
类型上都不能正常/多态地工作?
如果我理解正确,这是多态类型构造函数的唯一要点和目的Either a
吗?这fmap
适用于所有Either a b
类型?
我很困惑,我不确定我Either a
是否正确解释.有人可以确认1)我的解释是正确的2)如果没有那么请赐教.
谢谢阅读.
实际上并没有这样的事情Either a
.与多态函数一样,多态实例应该通过通用量化来读取系统-F样式:
forall a . instance Functor (Either a) where ...
仿函数实例本身是一个字典,即类型级函数
functor = ?f -> { ?a b -> (a->b) -> f a->f b }
所以这两种情况都是这样的
eitherFunctor = ?a -> functor (Either a)
或者,您可以将其视为编译器替换instance Functor (Either a)
为大量离散实例
instance Functor (Either ()) where ... instance Functor (Either Int) where ... ... instance Functor (Either (Either Int String)) where ... ...
从字面上看,显然不可能这样做.