这是一个啥样的结构? (具有部分逆但不是共单子的单子)

Posted

技术标签:

【中文标题】这是一个啥样的结构? (具有部分逆但不是共单子的单子)【英文标题】:What kind of structure is this? (Monad with a partial inverse but not a comonad)这是一个什么样的结构? (具有部分逆但不是共单子的单子) 【发布时间】:2021-09-22 05:33:56 【问题描述】:

我遇到了一个结构,它看起来像一个单边逆元和一些附加属性的单子。我不确定这个结构的哪些属性是必要的,哪些是偶然的,所以我将在我的描述中遵循一个简单的例子。

我有一个基本类型a,它由排序的字符串组成(例如"aacdee",但不是"abca")和来自a 的monad M,它只是List monad:M a 是列表的 排序的字符串。这个 monad 定义了 pure: a -> M afmap: (a -> a) -> M a -> M abind: (a -> M a) -> M a -> M a

现在我定义extract: M a -> a,它接受一个字符串列表,将它们连接起来并对结果进行排序。这是pure 的左逆,即a 上的extract . pure = id,但不是右逆。

我还想以extract . (extend f) = f 为所有f: M a -> a 的方式定义extend: (M a -> a) -> M a -> M a

虽然可以定义extend f = pure . f,但我不想这样做。 例如,如果f 是用字母表中的下一个字符替换每个字符、连接和排序的函数,我希望extend f 只用下一个字符替换每个字符。同样,如果f 从第一个字符串中删除所有“a”,从第二个字符串中删除所有“b”,等等。

举一个不那么简单的例子,将f 作为函数,它接受第一个字符串,然后如果第二个字符串比第一个字符串长,则使用第二个字符串的最后一个元素扩展第一个字符串,依此类推。例如,f ["ab", "c", "def"] = "abf"。在这种情况下,我希望 extend f 仅适合每个字符串,只留下对结果有贡献的字母,在示例中为 (extend f) ["ab", "c", "def"] = ["ab", "", "f"]

所有这一切背后的想法是,在M a 中可以对多种f 进行并行优化,我想将extend f 定义为针对许多特定情况的优化实现,回退到@987654348 @ 仅在未优化的情况下。

我的extend 不会满足comonad 公理,但至少会满足以下条件(或非常相似的条件,我不完全确定关联性):

(extend f) . pure = pure . f . pure,即在单个字符串上fextend f 基本相同, extend (extract . (fmap h)) = fmap h,即如果g = extract . (fmap h)分别作用于每个字符串,那么extend g也一样, (extend f) . (extend g) = extend (f . pure . g),即关联性,或者可能是一种较弱的形式。

我的问题。这是一个众所周知的结构吗?它有什么特别有趣的特性吗?

【问题讨论】:

【参考方案1】:

单独看extract,我们看到extract . pure = id。我们还看到extract . join = extract . fmap extract。这使得extract 成为algebra over the [] monad。

特别是,[] monad 上的代数完全对应于幺半群(范畴论解释:健忘函子 Monoids -> Sets 是 monadic,它的左伴随是 [],所以幺半群恰好是 [] 上的代数函子)。所以extracta 上定义了一个幺半群,具有明显的单位和组合规律。

至于extend,我认为您的类型不正确。这是因为extend f :: M a -> M a,所以extend f 不能作为extract 的参数,因此extract (extend f) 不进行类型检查。也许一旦你解决了这个问题,就会更容易理解这里发生了什么。

【讨论】:

对不起,我的符号可能不准确。我的意思是作文:extract ((extend f) x) = f x 代表M a 中的所有x。我现在在问题中添加了函数组合

以上是关于这是一个啥样的结构? (具有部分逆但不是共单子的单子)的主要内容,如果未能解决你的问题,请参考以下文章

好的现代 c 代码是啥样的? [关闭]

我应该在原则上为这个数据库结构创建啥样的实体

请问:VB 里面的MessageBox要怎么用,整个函数是啥样的?

花式指针是啥样的?

对于数组结果,optimisticResponse 是啥样的?

有啥样的工具,可以自动生成Oracle数据库的数据字典