重新想象矩阵

想象的功能不是
使奇怪的事情得到解决,甚至
使固定的事情变得奇怪。

-G.K.切斯特顿

为什么矩阵乘法的定义与矩阵加法的定义如此不同?如果我们不知道这些程序,我们能从第一原理推导出来吗?这些原则可能是什么?

这篇文章给出了矩阵的一个简单语义模型,然后用它来系统地得到我们称之为矩阵加法和乘法的实现。这个开发说明了我所说的“指称设计”,特别是类型类形态。顺便说一下,我给出了矩阵的一个不太寻常的公式,以及相应的矩阵“乘法”的定义。

有关更多详细信息,请参阅线性map-gadt源代码。

编辑:

  • 2012年12月17日:替换丢失B类矩阵加法描述中的条目。感谢Travis Cardwell。
  • 2012年12月18日:添加了关于数学/浏览器兼容性的注释。

注:我正在使用MathML进行下面的数学运算,它在Firefox上似乎运行得很好,但在Safari和Chrome上都没有。我使用Pandoc从markdown+lhs+LaTeX生成HTML+MathML。使用不同的Pandoc设置并需要对我的WordPress安装进行一些调整可能会有一个解决方法。如果有人知道怎么做(尤其是WordPress结尾),我会很感激你的指点。

继续阅读“重新想象矩阵”»

关于三维图形语义的思考

我设计软件的中心问题总是

这是什么意思?

对于函数式编程,这个问题特别明确。对于我定义的每个数据类型,我都希望有一个精确而简单的数学模型。(例如,我的行为模型是时间的函数,而我的图像模型是二维空间的函数。)类型上的每个操作也根据该语义模型给出了一个含义。

这个规范过程是应用于数据类型的指称语义,它为

  • 实施的正确性,
  • 无实施细节的用户文档,
  • 生成和证明属性,然后可用于自动测试,以及
  • 评估和比较设计决策的优雅性和表达能力。

有关示例(2D图像)、此过程的一些动机和讨论,请参阅Luke Palmer的帖子语义设计.另请参阅我关于类型类态射为指称设计提供了附加结构。

2008年春天,我开始开发一个功能强大的3D库,现场跳闸.我以前设计过功能性3D库,作为TBAG公司,活动VRML、和弗兰.出于上述所有原因,这次我想要一个基于语义的设计。一如既往,我想要一个

  • 简单,
  • 优雅,并且
  • 概述。

对于3D,我还希望该模型对GPU友好,即在(现代)GPU上执行良好,并允许使用其功能。

我没有想到或听到过一个我喜欢的模型,因此我在FieldTrip的工作中没有那种坚定的立场。去年二月,我想到了这样一个模型。从那以后,我一直在写这篇博客文章。最近,我再次专注于基于GPU的功能3D渲染,然后是Sean McDirmid提出了类似的问题,这让我再次思考。

继续阅读“关于3D图形语义的思考”»

具有类型类形态的指称设计

我刚完成一篇论文的草稿具有类型类形态的指称设计,提交给ICFP 2009年.这篇论文的主题是我在几根柱子这是一种基于语义的设计,由类型类形态指导。

我很想得到一些阅读材料和反馈。特别感谢提供相关工作的指针,以及尚不清楚的内容和可能削减的内容。这是一整页超出了限制,所以我必须在提交之前做一些修整。

摘要:

类型类为标准的各种实现提供了一种机制接口。这些接口中有许多是建立在数学上的传统等等不仅有规律性类型而且也是属性(法律)必须适用的。类型和属性提供了强大的对图书馆实施者的指导,同时也留有自由。一些剩余自由的怎样实现工作正常在中什么它完成了。

什么,不会影响怎样,本文提出了类型类态射(TCM),进一步完善了指称的构成风格语义。中医的想法很简单实例的含义是意义的实例这一原则决定了每种类型的含义类实例,从而定义实现的正确性。在一些案例中,它还提供了系统的实施指南一些案例,有价值的设计反馈。

本文通过几个类型、含义和形态。

你可以拿到纸并在此处查看当前勘误表.

提交截止日期是3月2日,因此在此之前的评论对我非常有帮助。

享受吧,谢谢!

什么是自动微分,为什么它有效?

伯特兰·罗素评论道

每件事都是模糊的,直到你努力使其精确为止,你才意识到这一点。

我又在考虑自动区分(AD),整理之前关于衍生产品和上的线性地图将其整合为一个连贯的整体,以提交ICFP。我理解其中的机制以及它正确的一些原因。毕竟,这是“链式法则”。

和往常一样,在写作过程中,我碰到了罗素的原则。我感到越来越不安,意识到我没有像我喜欢理解软件那样理解AD,也就是说,

  • 什么这是否意味着,独立于实施?
  • 怎么实现及其正确性是否从这个意义上优雅地流动?
  • 在哪里?否则,我们可以在前两个问题的答案的指导下走吗?

自从写作以来简单有效的功能反应性,想法类型类态射不断出现在我面前,作为一个提问和回答这些问题的框架。令我高兴的是,这个框架让我对自动差异化有了新的、更令人满意的见解。

继续阅读“什么是自动微分,为什么它有效?”»

功能未来价值的另一个角度

之前的一篇帖子介绍了功能未来价值这是一种价值观,直到未来才能知道,但可以在当前进行操作。该帖子提出了一个简单的未来值的指称语义,即时间/值对。在定义时间(使用马克斯幺半群),的实例Functor(仿真器),适用,莫纳德都是自动派生的。

后续帖子提供了通过多线程实现未来价值.不幸的是,该实现不一定满足语义,因为它允许线程调度的不确定性泄漏。尽管实现通常是正确的,但我并不满意。

过了一会儿,我想出了一个主意,真的很逗我发笑。如果我使用一种可以揭示部分信息的更微妙的时间形式,我最初的简单语义确实可以作为一种正确且可行的实现。实现这种微妙的时间形式变得相当棘手,这是我最初的动机无核武器论文中描述的操作员推挽式函数反应式编程和帖子具有明确选择的功能并发.

在想到无核武器突破。像我最喜欢的许多想法一样,回顾过去,这很简单也很明显:消除不确定性选择的模糊性(如环境管理委员会运算符),将其使用限制为非底部时相等的值。每当我们有两种不同的方法来回答同一个问题(或可能失败)时,我们可以使用无核武器两者都试一下。在这种情况下,失败(错误或非终止)不是问题。更强大的变体无核武器是最小上界运算符润滑油,如中所述合并部分值.

我一直在和无核武器实施。当两个(兼容的)计算竞争时,失败者会被杀死,从而释放出不再需要的循环。然而,我的前几个实现并没有递归终止其他为废弃计算服务产生的线程(来自嵌套使用无核武器).我在中提出了这个问题螺纹赛车的智能终端,这建议了一些更好的定义。在几篇有用的读者评论中,我的定义中的一些问题得到了解决,特别是在阻塞和取消阻塞异常方面。到目前为止,这些定义都没有可靠地完成任务,现在看起来GHC运行时系统中似乎有一个bug。我希望这个bug(如果有)很快就会被修复,因为我看到了更多无核武器润滑油可以使函数式编程更加模块化(正如John Hughes在为什么函数编程很重要).

我开始将未来的价值观和明确的选择作为实现的一种方式反应性函数式反应式编程(FRP)库。(请参见未来的无功值推挽式函数反应式编程.)在过去的几天里,我思考了一些在没有明确选择的情况下实现未来价值观的方法。这篇文章描述了一个这样的选择。

编辑:

继续阅读“功能未来价值的另一个角度”»

序列、段和信号

帖子序列、流和段回答了以下方框中缺少什么的问题:

无限的有限的,有限的
离散的 顺序
连续的功能 ???

我提出了一种简单的功能段,其表示包含长度(持续时间)和函数。此类型实现大多数常用类:单体,Functor(仿真器),拉链、和适用,以及科摩纳(Comonad),但不是莫纳德.它还实现了一个新的类型类,细分市场,它概括了列表函数长度,、和.

函数类型本身简单实用。我相信它也可以作为函数式反应式编程(FRP)的语义基础,我将在另一篇文章中解释这一点。然而,该类型有一个严重的性能问题,这使得它在某些目的上不切实际,包括作为FRP的实施。

幸运的是,我们可以通过在功能段顶部添加一个简单的层来解决性能问题,以获得我所称的“信号”。有了这个新层,我们可以有效地替换功能段,这些功能段以完全相同的语义实现完全相同的接口。令人高兴的是,类实例的定义相当简单,是根据函数段上的相应实例来定义的。

您可以下载这篇文章的代码.

编辑:

  • 2008-12-06:dup[]=[]接近尾声[内存]).
  • 2008-12-09:固定默认定义(感谢sclv)和添加的无点变体。
  • 2008年12月18日:固定应用程序,多亏了sclv。
  • 2011年8月18日:消除了复制,多亏了匿名。

继续阅读“序列、分段和信号”»

增强Zip

这篇文章是拉链折叠系列的第四部分,灵感来自Max Rabkin的漂亮的折叠发布。我本打算写一篇小帖子,但一篇变成了四篇。当我感觉到某件事可以变得更简单/更清晰时,我不能离开它。

要审查:

  • 第一部分将Max的左折叠数据表示与类型类形态联系起来,这种模式最近一直在引导我进行库的自然(不可避免)设计。
  • 第二部分简化了这种表示,以帮助理解zipping的本质,这样就失去了定义所需的表达能力Functor(仿真器)适用实例。
  • 第三部分证明了zipping定义在第二部分.

这篇文章展示了如何恢复Functor(仿真器)适用(非常有用的合成工具)折叠,但这样做的方式不会影响压缩功能。这个新层独立于折叠,可以分层任何可拉链类型.

你可以获取代码如下所述。

编辑:

  • 2009年2月15日:简化版带Cont,将两个类型参数合并为一个。添加了关于的functor注释cfoldlc'.

继续阅读“增强拉链”»

类型类形态的另一个可爱示例

我读了Max Rabkin最近的帖子漂亮的折叠非常激动。他演示了如何将同一列表上的多个折叠合并为一个过程,这样可以大大减少懒惰函数程序的内存需求。Max的诀窍是为折叠提供一个数据表示,以及一种组合表示的方法,该表示对应于组合折叠。

在过去几年里,我越来越注意到从Max定义背后窥视是一个可爱的模式,即类型类态射.

继续阅读“类型类变体的另一个可爱示例”»

编写备忘录尝试次数

帖子优雅的备忘录功能显示了一种简单的搜索尝试及其在函数记忆中的使用。这篇文章为备忘录尝试提供了一些撰写工具,其定义如下不可避免的,因为它们是由使用类型类形态简化语义.

继续阅读“撰写备忘录尝试”»

使用类型类形态简化语义

当我第一次在Fran及其前辈中使用功能反应性时,我没有意识到事件和反应行为的许多功能可以通过标准类型类进行打包。然后Conor McBride和Ross Paterson向我们介绍应用函子,我记得使用该模式将Fran中的所有起重操作员减少到两个,这对应于纯净的(< *>)在中适用类。因此,在开发一个新的函数式反应式编程(FRP)库时,我认为应该使接口现代化,以尽可能使用标准类型类。

在为这些类的FRP实例拼写精确(指称)语义时,我注意到一个可爱的重复模式:

每个方法的含义对应于相同的含义方法。

在这篇文章中,我将给出一些这个原理的示例,并对其有用性进行一些思考。有关更多详细信息,请参阅论文简单有效的功能反应性.另一篇帖子将开始探索类型类形态和类型组合,并提出我想知道的问题。

继续阅读“使用类型类形态简化语义”»