gpt4 book ai didi

haskell - Biapplicative 和 Bimonad?

转载 作者:行者123 更新时间:2023-12-03 09:11:45 25 4
gpt4 key购买 nike

Haskell 的 Data.Bifunctor基本上是:

class Bifunctor f where
bimap :: (a -> c) -> (b -> d) -> f a b -> f c d

我可以找到 Biapply也是。我的问题是,为什么没有完整的双层次结构(层次结构?),例如:
class Bifunctor f => Biapplicative f where
bipure :: a -> b -> f a b
biap :: f (a -> b) (c -> d) -> f a c -> f b d

class Biapplicative m => Bimonad m where
bibind :: m a b -> (a -> b -> m c d) -> m c d

bireturn :: a -> b -> m a b
bireturn = bipure

bilift :: Biapplicative f => (a -> b) -> (c -> d) -> f a c -> f b d
bilift f g = biap $ bipure f g

bilift2 :: Biapplicative f => (a -> b -> c) -> (x -> y -> z) -> f a x -> f b y -> f c z
bilift2 f g = biap . biap (bipure f g)

Pair 是其中的一个实例:
instance Bifunctor (,) where
bimap f g (x,y) = (f x, g y)

instance Biapplicative (,) where
bipure x y = (x,y)
biap (f,g) (x,y) = (f x, g y)

instance Bimonad (,) where
bibind (x,y) f = f x y

和类型如...
data Maybe2 a b = Fst a | Snd b | None
--or
data Or a b = Both a b | This a | That b | Nope

...国际海事组织也会有实例。

没有足够的匹配类型?还是我的代码存在严重缺陷?

最佳答案

范畴论中的单子(monad)是一个内仿函数,即域和余域是同一类别的仿函数。但是一个Bifunctor是产品类别 Hask x Hask 中的仿函数至Hask .但是我们可以尝试找出 Hask x Hask 中的 monad 是什么。类别看起来像。这是一个对象是类型对的类别,即 (a, b) , 和箭头是函数对,即来自 (a, b) 的箭头至(c, d)有类型 (a -> c, b -> d) .此类别中的内仿函数将类型对映射到类型对,即 (a, b)(l a b, r a b) ,以及成对的箭头到成对的箭头,即

(a -> c, b -> d) -> (l a b -> l c d, r a b -> r c d)

如果将此映射函数拆分为 2,您将在 Hask x Hask 中看到一个 endofunctor与两个 Bifunctor 相同年代, lr .

现在是单子(monad): returnjoin是箭头,所以在这种情况下,两者都是 2 个函数。 return是来自 (a, b) 的箭头至 (l a b, r a b) , 和 join是来自 (l (l a b) (r a b), r (l a b) (r a b)) 的箭头至 (l a b, r a b) .这是它的样子:
class (Bifunctor l, Bifunctor r) => Bimonad l r where
bireturn :: (a -> l a b, b -> r a b)
bijoin :: (l (l a b) (r a b) -> l a b, r (l a b) (r a b) -> r a b)

或分离出来:
class (Bifunctor l, Bifunctor r) => Bimonad l r where
bireturnl :: a -> l a b
bireturnr :: b -> r a b
bijoinl :: l (l a b) (r a b) -> l a b
bijoinr :: r (l a b) (r a b) -> r a b

类似于 m >>= f = join (fmap f m)我们可以定义:
  bibindl :: l a b -> (a -> l c d) -> (b -> r c d) -> l c d
bibindl lab l r = bijoinl (bimap l r lab)
bibindr :: r a b -> (a -> l c d) -> (b -> r c d) -> r c d
bibindr rab l r = bijoinr (bimap l r rab)

相对单子(monad)

最近, relative monads已经开发了。相对单子(monad)不需要是内仿函数!如果我们将论文翻译成 Bifunctor在 Haskell 中,你得到:
class RelativeBimonad j m where
bireturn :: j a b -> m a b
bibind :: m a b -> (j a b -> m c d) -> m c d

它定义了一个相对于双仿函数的单子(monad) j .如果您选择 j成为 (,)你得到你的定义。

定律与单子(monad)定律相同:
bireturn jab `bibind` k = k jab
m `bibind` bireturn = m
m `bibind` (\jab -> k jab `bibind` h) = (m `bibind` k) `bibind` h

第一定律阻止 Maybe2不是一个实例,因为 bibind必须能够从 bireturn 的结果中提取两个值.

关于haskell - Biapplicative 和 Bimonad?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13556314/

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