【发布时间】:2020-06-23 17:01:30
【问题描述】:
我正在尝试理解 State newtype,但我正在为一本书中同构的这种解释而苦苦挣扎:
Newtypes 必须具有与它们包装的类型相同的底层表示,因为 newtype 包装器在编译时会消失。所以 newtype 中包含的函数必须与它包装的类型同构。也就是说,必须有一种方法可以在不丢失信息的情况下从 newtype 转到它所包装的东西并再次返回。
应用于 State newtype 是什么意思?
newtype State s a = State { runState :: s -> (a, s) }
“必须有一种方法可以从 newtype 到它所包装的东西并再次返回”的解释不清楚。
另外,请你说一下,在这个例子中哪里有同构,哪里没有,为什么。
type Iso a b = (a -> b, b -> a)
newtype Sum a = Sum { getSum :: a }
sumIsIsomorphicWithItsContents :: Iso a (Sum a)
sumIsIsomorphicWithItsContents = (Sum, getSum)
(a -> Maybe b, b -> Maybe a)
[a] -> a, a -> [a]
【问题讨论】:
-
"应用于 State newtype 是什么意思?" --
State构造函数朝一个方向运行,runState函数朝相反方向运行。runState . State = id和State . runState = id。
标签: haskell