【发布时间】:2021-11-28 01:28:28
【问题描述】:
我声明了一个关于应用函子的组。从我们通常所说的“动作”来看,这样的组似乎可以使动作撤消:
import Control.Applicative
class Alternative f => Undoable f where
undo :: f a -> f a
作为一个群体,对于所有x :: Undoable f => f a,应满足以下法律:
x <|> undo x ≡ empty
undo x <|> x ≡ empty
一些实例:
import Control.Arrow
import Data.Functor.Compose
import Data.Functor.Product
import Data.Proxy
instance Undoable Proxy where
undo _ = Proxy
instance (Undoable f, Applicative g) => Undoable (Compose f g) where
undo (Compose x) = Compose (undo x)
instance (Undoable f, Undoable g) => Undoable (Product f g) where
undo (Pair x y) = Pair (undo x) (undo y)
instance Undoable m => Undoable (Kleisli m a) where
undo (Kleisli f) = Kleisli (undo . f)
至少对我来说,这些实例没有兴趣。一些非实例包括:
-
Maybe:一旦成功,无论其他选择如何,它总是成功的。 -
[]和ZipList:选项总是添加不确定性,而不是从中减去。-
ReadP和ReadPrec:如上所述。
-
-
IO:从字面上看,这个实例将是一台时间机器。尽管我们可以取现实与时空的商,但有一个实际的反例:不能忘记一个新的IORef。
Undoable 有什么特别有趣的例子吗?
【问题讨论】:
标签: haskell undo applicative alternative-functor