Haskell教程(https://www.fpcomplete.com/haskell/tutorial/monad-transformers/)说,如果我们假设以下定义
newtype State s a = State (s -> (s, a))
则以下定义
newtype StateEither s e a = StateEither (State s (Either e a))
是对
newtype StateEither s e a = StateEither (s -> (s, Either e a))
哪些替代步骤使之成为可能?
2条答案
按热度按时间rslzwgfq1#
这两个人并不是互相改写的:类型检查器将不会推断出这两者是相同的。然而,两者非常相似。
实际上,
State
类型定义为:这意味着对于
State s a
,它将s -> (a, s)
函数 Package 到State
数据构造函数中。如果我们因此删除State
数据构造函数,我们可以将其视为一个类型为s -> (a, s)
的函数,因此:在这种情况下,类型
State s (Either e a)
因此具有类型:因此:
将等同于:
这里使用
newtype
。这对于为类型类定义不同的示例很有用,因为函数也是Monad
的示例,但是我们想为State
的Monad
定义不同的instance
。rxztt3cl2#
对于
Data.Type.Coercion
,编译器可以证明它们相等。这种类型的值包含两种类型是可强制的证明:一个更有成效的见证方式是从中获取示例。
如果你可以通过
Compose (State s) (Either e)
导出StateEither s e
的示例,这就证明了它们在表示上是相等的。当完全应用时,
StateEither s e a
不仅与State s (Either e a)
同构,而且它们在内存中的表示相同,并且可以零成本并行。