当前位置: 首页 > 知识库问答 >
问题:

自由群单子

澹台承
2023-03-14

在范畴理论中,一个单子是两个伴随函子的组合。例如,也许单子是由遗忘函子组成的自由点集函子。同样地,列表单子是由遗忘函子组成的自由么半函子。

半群是最简单的代数结构之一,所以我想知道编程是否可以从更复杂的结构中受益。我在标准的Haskell包中没有找到免费的组单子,所以我将在这里定义它

data FreeGroup a = Nil | PosCons a (FreeGroup a) | NegCons a (FreeGroup a)

自由环和向量空间(它们总是自由的)呢?

对于任何代数结构s,一个范畴自由函子fs::set->s的存在意味着Haskell调用fold的函数的存在:

foldS :: S s => (a -> s) -> FS a -> s

它将基于a的函数提升为自由对象FS a上的S-morphism。通常的foldr函数是foldmonoid的专门化(在Haskell中称为foldmap,出于某种原因,我不太明白),monoid是函数的集合b->b,组合为乘法。

mult :: FreeGroup a -> FreeGroup a -> FreeGroup a
mult Nil x = x
mult x Nil = x
mult (PosCons x y) z = PosCons x (mult y z)
mult (NegCons x y) z = NegCons x (mult y z)

inverse :: FreeGroup a -> FreeGroup a
inverse Nil = Nil
inverse (PosCons x y) = mult (inverse y) (NegCons x Nil)
inverse (NegCons x y) = mult (inverse y) (PosCons x Nil)

groupConcat :: FreeGroup (FreeGroup a) -> FreeGroup a
groupConcat Nil = Nil
groupConcat (PosCons x l) = mult x (groupConcat l)
groupConcat (NegCons x l) = mult (inverse x) (groupConcat l)

instance Functor FreeGroup where
  fmap f Nil = Nil
  fmap f (PosCons x y) = PosCons (f x) (fmap f y)
  fmap f (NegCons x y) = NegCons (f x) (fmap f y)

instance Applicative FreeGroup where
  pure x = PosCons x Nil
  fs <*> xs = do { f <- fs; x <- xs; return $ f x; }

instance Monad FreeGroup where
  l >>= f = groupConcat $ fmap f l

共有1个答案

乔宏峻
2023-03-14

“免费团体monad有任何编程用途吗?”

由于在过去的四个月里缺乏答案,我想答案是‘不,不是真的’。但这是一个有趣的问题,因为它是基于基本的数学概念,所以在我看来(也)它应该是。

首先,我注意到提议的自由组功能也可以很容易地用一个a列表来实现,

type FreeGroupT a = [Either a a]

fgTofgT :: FreeGroup a -> FreeGroupT a
fgTofgT Nil = []
fgTofgT (a :+: as) = Right a : fgToList as
fgTofgT (a :-: as) = Left a : fgToList as

fgTTofg :: FreeGroupT a -> FreeGroup a
fgTTofg [] = Nil
fgTTofg (Right a : as) = a :+: fgTTofg as
fgTTofg (Left a : as) = a :-: fgTTofg as

--using (:-:) instead of NegCons
--and   (:+:) instead of PosCons

但是,作为一个正确的用例,这个示例失败了,因为我们希望'a':+:'b':+:'b':-:'a':-:[][]是相同的程序,但实际上并非如此。此外,将每个列表术语包装在上面讨论过的Off中也很容易。

 类似资料:
  • 我看到自由单子这个词时不时地出现了一段时间,但每个人似乎只是在使用/讨论它们,而没有给出它们是什么的解释。那么:什么是自由单子?(我会说我熟悉单子和Haskell基础,但对范畴理论只有非常粗略的知识。)

  • 在Mark Seemann的博客文章和示例中,我第一次看到了免费单子作为构建纯代码和IO代码之间边界的一种方式。我的基本理解是,一个免费的单子可以让您构建一个纯函数的程序(抽象语法树-AST),然后解释器将其翻译成一系列不纯的过程调用。因此,这个解释器将AST的纯操作转换为一系列的一元IO操作。 我想知道这是否复制了Haskell运行时已经在IO Monad上做的事情。如果我认为IO没有什么特别的

  • 我正在尝试使用 JCA 和 CICSECI 功能通过 CICS 事务网关连接到 IBM 大型机。 我的Servlet代码是: 我得到的解释是: 我的服务器.xml如下: 我的POM是: 当我搜索错误代码时。IBM文档声明:https://www . IBM . com/support/knowledge center/en/SSZHFX _ 9 . 2 . 0/ctg 9628 e . html

  • 我不知道免费单子是用来做什么的,也不知道单子转换器库是什么。我也听说过mtl和自由单子的辩论,但我不确定是什么,因为我在互联网上找不到任何关于这一点的讨论。 有人能解释一下这场争论是关于什么的吗?

  • 《自由软件,自由社会:理查德·斯托曼选集》Free Software, Free Society: Selected Essays of Richard M. Stallman是一本指导了无数人的书籍,它将理查德·斯托曼的自由软件哲学和思想,阐述的淋漓尽致。 此书第一版首发于 2002 年。也是在 2002 年,北京 GNU/Linux 用户组(BLUG)成立了,经过十多年的发展壮大,已经成为中国

  • 绘图工具是指可以直接操作 Highcharts 的渲染层并绘制基础的图形,例如直接在图表中添加 圆形、矩形、路径或文字,甚至是独立于图表的图形。 在主流的浏览器中绘图工具对象是 SVG 的封装,对应的在低版本 IE (IE8 以下)中是 VML 封装。 已经实例化的图表对象可以通过 chart.renderer 来获取绘图工具对象,如果需要独立图表的绘图工具对象,请通过 var renderer