这是什么结构?(具有部分逆但不是余单子的范畴单子)

4
我遇到了一个看起来像是单子但具有单侧逆元和其他属性的结构。我不确定这个结构的哪些属性是必要的,哪些是偶然的,因此在我的描述中我将遵循一个简单的例子。我的基本类型是a,由排序字符串组成(例如"aacdee"但不包括"abca"),以及从a到List单子M a。这个单子定义了pure: a -> M afmap: (a -> a) -> M a -> M abind: (a -> M a) -> M a -> M a。现在我定义了extract: M a -> a,它接受一个字符串列表,将它们连接起来并对结果进行排序。这是pure的一个左逆元,即extract . pure = ida上成立,但不是一个右逆元。我还想定义extend: (M a -> a) -> M a -> M a,使得extract . (extend f) = f对于所有的f: M a -> 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定义为许多特定情况的优化实现,并在未优化的情况下返回到extend f = pure f

我的extend函数不满足共函子的公理,但至少满足以下条件(或非常相似的条件,我不能完全确定结合性):

  • (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个回答

1

仅看extract,我们可以看出extract . pure = id。我们还可以看到extract . join = extract . fmap extract。这使得extract成为[]单子上的代数

特别地,[]单子上的代数恰好对应于幺半群(范畴论解释:忘却函子Monoids -> Sets是单子的,它的左伴随是[],因此幺半群恰好是[]上的代数)。因此,extracta上定义了一个带有明显单位和组合法则的幺半群。

关于extend,我认为你没有正确的类型。这是因为extend f :: M a -> M a,所以extend f不能作为extract的参数,因此extract (extend f)无法通过类型检查。也许一旦你修复了这个问题,就会更容易理解这里发生了什么。


1
抱歉,我的符号可能不太准确。我指的是组合:对于所有M a中的xextract ((extend f) x) = f x。我现在已经在问题中添加了函数组合。 - AndreA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接