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

CodataType真的是终端代数吗?

齐宗清
2023-03-14

考虑一下“类型的类别”,类似于Hask,但有任何适合讨论的调整。在这样一个范畴内,可以说(1)初始代数定义数据类型,(2)终端代数定义同数据类型。

我在努力使自己相信(2)。

考虑函子t(t)=1+a*t。我同意最初的T-代数定义良好,并且确实定义了[a],即a的列表。根据定义,初始的T-代数是一个类型X和一个函数F::1+a*x->X,因此对于任何其他类型Y和函数G::1+a*y->Y,只有一个函数M::x->Y,这样的函数M。f=g。T(m)(其中.表示函数组合运算符,如Haskell中的那样)。通过将F解释为列表构造函数,G解释为初始值和步进函数,T(m)解释为递归操作,在给定G中定义的任何初始值和任何步进函数的情况下,该等式本质上断言函数m的惟一存在性,这就需要一个行为良好的fold以及基础类型A的列表。

例如,G::Unit+(a,Nat)->Nat可以是()->0(_,n)->n+1,在这种情况下M定义长度函数,或者G可以是()->0(_,n)->0,然后M定义常数零函数。这里的一个重要事实是,对于任何GM总是可以唯一定义的,就像fold不会对其参数施加任何反作用一样,总是产生唯一的定义良好的结果。

这似乎不适用于终端代数。

考虑上面定义的同一个函数t。终端T-代数的定义与初始代数相同,只是M现在是X->Y类型,方程现在变成了M。g=f。T(m)。据说这应该定义一个潜在的无限列表。

但是,对于以下两个修改过的G定义中的任何一个,我再也看不到任何定义良好的M了。

首先,当g再次为()->0(_,n)->n+1但类型为g::Unit+(Bool,Int)->Int时,m必须满足m(g((b,i)))=Cons b m(g(i)),这意味着结果取决于b。但这是不可能的,因为M(g((b,i)))实际上只是M(i+1),根本没有提到b,所以方程没有很好地定义。

其次,当g又是g::Unit+(Unit,Int)->Int类型,但定义为常数零函数G_=0时,m必须满足m(g()))=nilm(g((),i))=Cons()m(g(i)),这是矛盾的,因为它们的左手边是相同的,都是m(0),而右手边从不相同。

总之,有些T-代数与假定的终端T-代数没有态性,这意味着终端T-代数不存在。codatatype流(或无限列表)的理论建模(如果有的话)不能基于函子t(t)=1+a*t的不存在的终端代数。

非常感谢上面故事中任何瑕疵的暗示。

共有1个答案

益稳
2023-03-14

(2)终端代数定义同数据类型。

这是不对的,codataType是终端余代数。对于T函子,余代数是xf::x->tx的类型。(x1,f1)(x2,f2)之间的t-余代数态性是g::x1->x2,使得fmap g。f1=f2。g。使用这个定义,终端t-algebra定义了可能无限的列表(所谓的“colists”),而结束由unfold函数见证:

unfold :: (x -> Unit + (a, x)) -> x -> Colist a

但是请注意,终端t-algebra确实存在:它只是Unit类型和常数函数t unit->Unit(对于任何t,它都是终端代数)。但这对于编写程序来说并不是很有趣。

 类似资料:
  • 问题内容: 我想在php和jquery或ajax中编写一个“终端”模拟器。 我的意图不是执行真正的终端命令,我想执行echo等命令并将结果检索到TextArea,或者执行newuser之类的命令并打开一个jquery对话框或网页。有什么方法可以开发这个东西吗? 我想要的是在其中获得响应的文本区域以及在其中放置命令的文本输入字段。需要做的功能是调用一个php文件,在该文件中管理文本字段上的数据输入,

  • 问题内容: 使用终端上的命令只会使用户误以为屏幕已被清除…使用鼠标滚动时,您仍然可以看到以前命令的输出。当您淹没在文本海啸中时,这将使生活变得困难。 可以在Internet上找到的各种解决方案(转义码等)只是clear命令已经完成的工作的变体。 那么,如何真正清除Linux中终端的内容呢? 问题答案: 使用以下命令可以清晰显示屏幕,而不仅仅是添加新行… 是的,这是bash提示上的“ printf”

  • 问题内容: java中的try … catch … finally块共有3种排列。 试着抓 尝试…抓住…最后 尝试…最后 一旦执行了finally块,控制权将移至finally块之后的下一行。如果我删除了finally块并将其所有语句移到try … catch块之后的行,那么与将它们放入finally块中的效果相同吗? 问题答案: 我认为willcode最接近在这里表达关键点,也许每个人都知道,但

  • 某些键的虚拟键代码,如shift, [ , ],Del等,在java中显示为与C不同的值 /C.例如: 这是什么原因?这些代码是虚拟代码还是不同的类型?对于包括字母、数字在内的键,功能键(F1-F12)、退格、'等是相同的。 我可能误解了一个概念,在这种情况下,请澄清。 在C/C中登记 签入Java Ref:KeyEvent类

  • 有什么建议如何在VS Code中的代码和集成终端之间切换? 例如,在 PowerShell ISE 中,它是:Ctr D 终端和 Ctr I 代码 找不到任何类似的VS Code。 提前感谢您的任何建议

  • 行动时刻 - 模拟代理计费 在my-org.com的FreeRADIUS服务器上执行以下操作: 将目录更改为my-org.com的FreeRADIUS服务器上用于模拟bob@your-org.com计费的文件所在的目录。 确保FreeRADIUS在代表my-org.com和your-org.com的服务器上以调试模式运行。 在my-org.com服务器上发出以下命令: $> radclient 1