haskell - 双胞胎的方法是什么?

标签 haskell category-theory comonad bifunctor

在思考什么更有用的标准类建议to this one

class Coordinate c where
  createCoordinate :: x -> y -> c x y
  getFirst :: c x y -> x
  getSecond :: c x y -> y
  addCoordinates :: (Num x, Num y) => c x y -> c x y -> c x y

我突然想到,而不是 VectorSpace -y R2 ,一个更普通的野兽可能潜伏在这里:Type -> Type -> Type它的两个包含的类型都可以被提取。嗯,也许他们可以是 extract 编?

结果不是comonad也不是 bifunctors 包中包含一个名为 Bicomonad 的东西.问题是,从理论上讲,这样的类(class)是否有意义?不像 Bimonad (这也没有定义,我真的看不出看起来如何),一个天真的定义似乎是合理的:
class Bifunctor c => Bicomonad c where
  fst :: c x y -> x
  snd :: c x y -> y
  bidup :: c x y -> c (c x y) (c x y)

可能与法律有关
fst . bidup ≡ id
snd . bidup ≡ id
bimap fst snd . bidup ≡ id
bimap bidup bidup . bidup ≡ bidup . bidup

但我发现 bidup 结果的两个字段令人不安包含相同的类型,并且还有很多其他的,也许是“更好”的可以想象的签名。

有什么想法吗?

最佳答案

这不是答案,而是 Bimonad , 这个怎么样?

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

biap :: Bimonad p => p (a -> b) (c -> d) -> p a c -> p b d
biap p q = p >>== \ab cd -> q >>== \a c -> bipure (ab a) (cd c)

instance Bimonad (,) where
  (a,b) >>== f = f a b

我不知道这是否绝对正确/有趣,甚至远程有用,但从 Haskell 的角度来看,它闻起来很合适。是否与您的 Bicomonad 匹配或类似的东西?

关于haskell - 双胞胎的方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40835094/

相关文章:

haskell - 在 Hedgehog 中通过 'Gen' 或通过 'forAll' 生成随机输入的区别

haskell - MonadWriter 类中的冗余

haskell - 为什么 Haskell/GHC 不支持记录名重载

haskell - 类型级仿函数只是 Hask 2 类中的仿函数吗?

haskell - 如何在 Haskell 中捕获除以零错误?

haskell - 在 M 中是否存在单子(monad)自然的非同一性单子(monad)态射 M ~> M?

haskell - curry 是通用构造的因式分解器

haskell - 树仿函数和可折叠但带有节点。对此有什么概括吗?

math - 我应该如何在 Haskell 中实现凯莱表?

haskell - 如何将延续单子(monad)分解为左右伴随?