2011年1月存档

长度型向量的检索

你可能已经注意到,我一直在思考和写作备忘录 尝试最近。我不是有意的;他们只是不断出现。

记忆化是将函数转换为数据结构。一种简单、优雅、纯粹的记忆功能形式来自于应用三种常见类型的同构,这三种同构也对应于高中数学中常见的三个指数定律,正如拉尔夫·欣泽(Ralf Hinze)在其论文中指出的那样广义Tries的推广

在Haskell中,可以通过一个关联的functor,尝试,带有方便的同义词“k↛v(千伏)“用于尝试k v,如中所示高阶类型的优雅记忆(请注意,我已将漂亮打印从“k:→:v“至”k↛v(千伏)“.)关键属性是数据结构对函数进行编码(同构),即。,

k↛a公司k→a

在大多数情况下,我们忽略了非严格性,尽管有令人愉快的解决方案用于正确记忆非限制函数。

我的 以前的 帖子探索了使用类型静态绑定数字和确定向量长度的方法。

正如(无限)流是对一元自然数的自然尝试一样,我们在反向工程长度型向量长度类型的向量(一维数组)是静态的自然trie有界的自然数。

BNat公司n↛a选择Vec公司不适用

等等

BNat公司n→a Vec公司不适用

回顾过去,这种关系完全不足为奇,因为长度向量n个是值的集合,由索引0, . . . , n个 - 1

在那里面同一职位,我注意到向量不仅是有界数的trie,而且当元素也是有界数时,向量也可以被认为是作为数字。数字和数字基数都是静态捕获的,类型为:

类型 数字n b个= Vec公司n个(BNat公司b)

类型参数n个b条以下是一元数的类型编码,即从零和后继数构建(Z轴S公司). 例如,当b≡S(S Z),我们有n个-位二进制数。

在这篇新文章中,我看了另一个关于尝试和向量的问题。鉴于此Vec n公司是的trieBNat n(BNat n),是否也有一个trie forVec n公司?

编辑:

  • 2011年1月31日:将trie符号切换为“k↛v(千伏)“以避免iPad上缺少字符。

继续阅读“A trie for length-typed vectors”»

反向工程长度型向量

这个最后的 很少的 帖子posts沿着一条曲折的路径走向长度型向量的类型公式。修复列表,我琢磨着像列表这样的东西是如何成为trie类型的。这个functor(必然是无限列表)是Peano数的自然trie。标准列表函子[](可能是有限列表)似乎不是trie,因为它是由和构建的。然而,函子Vec n公司长度向量(“固定列表”)n个仅由(同构于)产品构建(对于任何给定的n个)这很可能是一次尝试。

是什么类型的Vec n公司相应的trie?换句话说,对于什么类型兽医同构于q→a(对于所有人).

把这个问题放在脑后,是什么更简单的类型以标准的方式产生了长度型向量?

编辑:

  • 2011-02-01:定义数字n b作为BNat n↛BNat b

继续阅读“反向工程长度类型向量”»

使用长度型向量做更多事情

帖子修复列表定义了一种(常用的)向量类型,其长度由类型静态确定。兽医,长度为n个,元素的类型为,其中n个是一个以类型编码的一元数,由零和后继数字组成(Z轴S公司).

中缀 5 :<

数据 Vec公司 *** 哪里
ZVec公司 Vec公司 Z轴
(:<)a→Vec公司n a→Vec公司(S公司n) 一个

这很容易定义文件夹对于可折叠的例如,功能性维修计划对于Functor(仿真器)、和(⊛)对于适用.完成适用然而,这个例子很棘手。不同文件夹功能性维修计划、和(⊛)纯净的没有可供爬行的向量结构。无论如何,它必须创建正确的结构。我把这个挑战作为一个问题留给了读者。在这篇文章中,我给出了一些解决方案,包括我目前最喜欢的。

你可以找到这个帖子的代码和这两个以前的 在一个代码存储库

继续阅读“使用长度型向量实现更多功能”»

修复列表

在岗位上通过非记忆化记忆多态函数,我在尝试时玩弄了列表的想法。我不认为【a】是trie,只是因为【a】是一个总和类型(可以是nil或cons),而tries是由标识、乘积和组合函子构建的。与此相反, 一个trie,只使用标识和乘积函子构建。此外,不只是任何旧的trie,而是对应于Peano(一元自然)数的trie。,流a≅N→a,其中

数据 N个 =  | 成功 N个

数据 = 欺骗一个(a)

如果我们还不知道类型,我们会系统地从N个,使用标准同构。

是一个trie(在一元数上),因为它没有选择点,即在构造中没有和。然而,流是无限的,这并不总是我们想要的。相反,列表可以是有限的,但在我理解的任何意义上都不是trie。在本文中,我将探讨如何修理列表,因为没有选择点(和),所以它们可以是有限的,也可以是trie?

您可以找到此帖子的代码和前一个在一个代码存储库

编辑:

继续阅读“修复列表”»

键入的数字

最近我一直在思考如何从高级规范中派生低级大规模并行程序。循环工具之一是使用关联运算符进行折叠(约简)。关联性允许线性将计算重组为,显示并行性。我将写下我对派生并行程序的一些想法,但首先我想分享我遇到的一些有趣的想法,这些想法涉及自然数(用各种基数表示)、向量(一维数组)和树。这篇文章对于一篇博客文章来说相当长,所以我把它分成了六篇。贯穿始终的主题将使用类型来捕获尺寸数字、向量和树。

在撰写本系列文章时,我想探索二进制数如何浮现从更简单和/或更普遍的概念。树也是如何从二进制数中产生的。

让我们从一元(Peano)自然数开始:

数据 一元 =  | 成功 Unary公司

您可能会注意到与列表类型的相似性,可以这样写:

数据 列表=  | 欺骗一个(列表a)

或者重新命名:

数据【a】=[]|:【a】

专业化(),我们也可以定义一元作为单位值列表:

类型 一元 =[()]

尽管只有当我们愿意忽略底层元素(即。,⊥ ∷ ()).

然而,假设我们不想使用一元。我们可以定义并使用二进制自然数的类型。二进制数可以是零,也可以是零位后跟二进制数,或者是一位后跟一个二进制数:

数据 二元的 =  | 零和 二元的 | 一个和 二元的

或者,将后两种情况合并为一种,使位类型明确:

数据 二元的 =  | 非零 比特 二元的

等效地,

类型 二元的 =[比特]

我们可以定义比特键入作为的同义词布尔或者作为它自己独特的双值数据类型。

接下来,三元数、十进制数等如何?与其定义数据类型的临时集合,不如如何定义n个-ary数字?

您可以在代码存储库

编辑:

  • 2011-01-30:求大于给定数的自然数示例
  • 2011年1月30日:平等与比较
  • 2011年1月30日:更多章节标题
  • 2011-01-30:提及与交换图的对应
  • 2011-01-30:指向代码存储库

继续阅读“打字数字”»