gpt4 book ai didi

haskell - "undoable"应用仿函数的例子?

转载 作者:行者123 更新时间:2023-12-04 18:10:58 26 4
gpt4 key购买 nike

我宣布了一个关于应用仿函数的小组。从我们通常所说的“ Action ”来看,似乎这样的组将使 Action 成为。撤消 :

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 :选项总是增加不确定性,而不是从中减去。
  • ReadPReadPrec : 如上所述。

  • IO : 从字面上看,这个实例将是一台时间机器。尽管我们可以取现实与时空的商,但有一个实际的反例:一个新的 IORef不能忘记。
  • Undoable 有什么特别有趣的例子吗? ?

    最佳答案

    我会考虑这样的事情。不是 Prelude.Functor因为键需要是可订购的(也可以是 Hashable 或只有 Eq ,你知道权衡)。
    它基本上是一个允许负多重性的多重集。反物质元素。

    import qualified Data.Map as Map
    import qualified Prelude as Hask
    import Data.List (sortOn)
    import Control.Category.Constrained.Prelude
    import Control.Arrow.Constrained
    import Control.Applicative.Constrained

    data Dirac n k = Dirac { getOccurences :: Map.Map k n }

    instance Real n => Functor (Dirac n) (Ord⊢(->)) (->) where
    fmap (ConstrainedMorphism f) (Dirac m)
    = Dirac . Map.fromAscList
    . concatMap (\((k,n₀):grp) -> case sum $ n₀ : map snd grp of
    0 -> []
    μ -> [(k,μ)] )
    . groupBy (comparing fst)
    . sortOn fst
    . map (first f)
    $ Map.toList m
    instance Num n => Undoable (Dirac n) where
    undo (Dirac m) = Dirac $ Map.map negate m
    我认为可以有一个符合的 Applicative/ Alternative围绕这个建立,但我不完全确定。

    关于haskell - "undoable"应用仿函数的例子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69489902/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com