繁体   English   中英

Either和Either Int有什么区别?什么是A?多态类型构造函数?它的目的是什么?

[英]What is the difference between Either a and Either Int? What is Either a ? A polymorphic type constructor? What is its purpose?

简介

我理解了Maybe aMaybe Int之间的区别,我也理解了Either abEither Int Int之间的区别。 我也明白Either IntMaybe是同一种动物,它们都将一个类型作为一个参数并生成一个新类型,即它们都是类型构造函数,它们将一个类型作为参数(具体如Int或具体不像a )并生成具体类型或多态类型。

现在我不明白的是什么样的结构是Either a 它不像Maybe因为如果我们向它提供具体类型(如Int ),它永远不会产生具体的(读取非多态)类型。 因此,在这种情况下是正确的调用Either a多态型的构造,并调用Maybe一个具体类型的构造函数? (这就是我如何称呼它们,它们在Haskell命名法中的正式名称是什么?)

此外,我不知道Haskell类型系统中的官方分类是什么样的类型构造函数,如Either a因为它不能与Maybe属于同一类别,因为 - 如前一段所述 - 无论我们使用什么类型apply Either a结果类型永远不会是具体类型,即它将始终是一个多态类型,例如, Either a Int

我问这个的原因是因为Either a是一个Functor 这开始变得令人困惑。 没有像我以前见过的任何东西。 我不知道我应该如何在概念上解释这样Either a事实: 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 ca -> Either cb )将在c具有多态性?

这是使Either a Functor实例的唯一效果吗? 这样得到的fmap函数在c会是多态的吗?

相较于 ,例如,使Either Int的实例Functor

然后生成的fmap只能在Either Int a类型上工作,但在所有fmapEither ab类型上都不能正常/多态地工作?

如果我理解正确,这是多态类型构造函数如Either a的唯一目的和目的吗? 那么fmap适用于所有fmap类型的Either ab

我很困惑,我不知道如果我解释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 ...
...

从字面上看,显然不可能这样做。

我不知道你的一些问题的答案 - 比如,某些事情被正式称为什么,或者在哪里阅读它们,因为在学习类型系统后它们对我来说是不言而喻的。 (这不应被视为一种建议,即获得未知的唯一方法是学习依赖型系统。)

Either Int也可以被声明为Functor ,但是我们可以表达一个更一般的声明, Either的第一个参数是否是Int实际上并不重要 - 因此,我们声明Either a是一个Functor

在其他类型的系统中,存在是不需要区分kinds ,而不是Either可被视为一种类型的,太; 但是在Haskell中,它们与类型分开处理以简化类型系统。 Kinds是一种描述类型具有arity并通过仅区分arity来避免依赖类型的复杂化的方式。 所以, Either(->)有arity 2,或者kind *->*->*

Either a Int是与[a]类似的动物,因为它们的种类是*

fmap :: (a->b) -> Either ca -> Either cbc是多态的,的确如此。 该声明的重要性在于它保留c 当然,任何类型c的唯一方法就是当Left x保持不变时。

Maybe不是一种类型。 Maybe Int是一种类型。 Maybe ,就其本身而言,你可以做出类型的东西。 它是一个类型构造函数

Either不是类型,它是类型构造函数。 你知道如何理解Haskell函数吗? 好吧,你也可以讨论类型构造函数。 因此, Either是2参数类型的构造函数, Either Int是1参数类型的构造函数。 Either Int Bool是一种实际类型。

Functor类型类是一种更高级的类型类 Show这样的东西适用于某种类型 ; Functor适用于类型构造函数 例如,你不写

instance Functor (Maybe Int) where ...

相反,你写

instance Functor (Maybe) where ...

Functor的定义是

class Functor f where
  fmap :: (x -> y) -> f x -> f y

这里f不是一个类型 ,而是一个1参数类型的构造函数。 你给它一个参数(比如xy )来构造一个真实的,可用的类型。

值具有“类型”。 类型签名中的东西有“种类”。 “类型”有种类* “1参数类型构造函数”具有类型“* - > *”。 它基本上说明了为获得实际类型需要提供多少参数。

总之,您可以Functor (Either Int)编写一个实例。 但那时只允许Int ; 通过使它成为一个类型变量,你可以使它更具多态性。

请注意,如果你想要它,那么Either第二个参数是固定的而不是第一个...你不能这样做。 从某种意义上说,更高级的类型类别有点像kludge。 它们很容易理解,它们适用于简单的案例。 功能依赖关系和关联类型是两种(不兼容)尝试更好地解决此问题。

暂无
暂无

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

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