2011年1月31日下午03:03
你可能已经注意到,我一直在思考和写作备忘录 尝试最近。我不是有意的;他们只是不断出现。
记忆化是将函数转换为数据结构。一种简单、优雅、纯粹的记忆功能形式来自于应用三种常见类型的同构,这三种同构也对应于高中数学中常见的三个指数定律,正如拉尔夫·欣泽(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”»
你可能已经注意到了,我最近一直在思考和写关于备忘录尝试的内容。我不是有意的;他们只是不断出现。记忆是将函数转换为。。。
2011年1月31日上午09:52
这个最后的 很少的 帖子posts沿着一条曲折的路径走向长度型向量的类型公式。在修复列表,我琢磨着像列表这样的东西是如何成为trie类型的。这个流
functor(必然是无限列表)是Peano数的自然trie。标准列表函子[]
(可能是有限列表)似乎不是trie,因为它是由和构建的。然而,函子Vec n公司
长度向量(“固定列表”)n个
仅由(同构于)产品构建(对于任何给定的n个
)这很可能是一次尝试。
是什么类型的Vec n公司
相应的trie?换句话说,对于什么类型问
是兽医
同构于q→a
(对于所有人一
).
把这个问题放在脑后,是什么更简单的类型以标准的方式产生了长度型向量?
编辑:
- 2011-02-01:定义
数字n b
作为BNat n↛BNat b
。
继续阅读“反向工程长度类型向量”»
最后几篇帖子沿着一条曲折的路径,为长度型向量定义了一种类型。在修复列表中,我思考了像列表这样的东西是如何。。。
2011年1月30日下午05:16
帖子修复列表定义了一种(常用的)向量类型,其长度由类型静态确定。在兽医
,长度为n个
,元素的类型为一
,其中n个
是一个以类型编码的一元数,由零和后继数字组成(Z轴
和S公司
).
中缀 5 :<
数据 Vec公司 ∷ *→*→* 哪里
ZVec公司 ∷ Vec公司 Z轴一
(:<)∷a→Vec公司n a→Vec公司(S公司n) 一个
这很容易定义文件夹
对于可折叠的
例如,功能性维修计划
对于Functor(仿真器)
、和(⊛)
对于适用
.完成适用
然而,这个例子很棘手。不同文件夹
,功能性维修计划
、和(⊛)
,纯净的
没有可供爬行的向量结构。无论如何,它必须创建正确的结构。我把这个挑战作为一个问题留给了读者。在这篇文章中,我给出了一些解决方案,包括我目前最喜欢的。
你可以找到这个帖子的代码和这两个以前的 个在一个代码存储库。
继续阅读“使用长度型向量实现更多功能”»
修复后列表定义了一种(常用)类型的向量,其长度由类型静态确定。在Vecna中,长度为n,元素具有。。。
2011年1月30日上午10:14
在岗位上通过非记忆化记忆多态函数,我在尝试时玩弄了列表的想法。我不认为【a】
是trie,只是因为【a】
是一个总和类型(可以是nil或cons),而tries是由标识、乘积和组合函子构建的。与此相反,流
是一个trie,只使用标识和乘积函子构建。此外,流
不只是任何旧的trie,而是对应于Peano(一元自然)数的trie。,流a≅N→a
,其中
数据 N个 = 零 | 成功 N个
数据 流一= 欺骗一个(流a)
如果我们还不知道流
类型,我们会系统地从N个
,使用标准同构。
流
是一个trie(在一元数上),因为它没有选择点,即在构造中没有和。然而,流是无限的,这并不总是我们想要的。相反,列表可以是有限的,但在我理解的任何意义上都不是trie。在本文中,我将探讨如何修理列表,因为没有选择点(和),所以它们可以是有限的,也可以是trie?
您可以找到此帖子的代码和前一个在一个代码存储库。
编辑:
- 2011-01-30:增加扰流板警告。
- 2011-01-30:指向代码存储库。
继续阅读“修复列表”»
在通过非模因化对多态函数进行模因化后的文章中,我玩弄了列表作为尝试的想法。我认为[a]不是trie,仅仅因为[a]是总和。。。
2011年1月29日上午09:53
最近我一直在思考如何从高级规范中派生低级大规模并行程序。循环工具之一是使用关联运算符进行折叠(约简)。关联性允许线性链将计算重组为树,显示并行性。我将写下我对派生并行程序的一些想法,但首先我想分享我遇到的一些有趣的想法,这些想法涉及自然数(用各种基数表示)、向量(一维数组)和树。这篇文章对于一篇博客文章来说相当长,所以我把它分成了六篇。贯穿始终的主题将使用类型来捕获尺寸数字、向量和树。
在撰写本系列文章时,我想探索二进制数如何浮现从更简单和/或更普遍的概念。树也是如何从二进制数中产生的。
让我们从一元(Peano)自然数开始:
数据 一元 = 零 | 成功 Unary公司
您可能会注意到与列表类型的相似性,可以这样写:
数据 列表一= 无 | 欺骗一个(列表a)
或者重新命名:
数据【a】=[]|一:【a】
专业化一
到()
,我们也可以定义一元
作为单位值列表:
类型 一元 =[()]
尽管只有当我们愿意忽略底层元素(即。,⊥ ∷ ()
).
然而,假设我们不想使用一元。我们可以定义并使用二进制自然数的类型。二进制数可以是零,也可以是零位后跟二进制数,或者是一位后跟一个二进制数:
数据 二元的 = 零 | 零和 二元的 | 一个和 二元的
或者,将后两种情况合并为一种,使位类型明确:
数据 二元的 = 零 | 非零 比特 二元的
等效地,
类型 二元的 =[比特]
我们可以定义比特
键入作为的同义词布尔
或者作为它自己独特的双值数据类型。
接下来,三元数、十进制数等如何?与其定义数据类型的临时集合,不如如何定义n个-ary数字?
您可以在代码存储库。
编辑:
- 2011-01-30:求大于给定数的自然数示例
- 2011年1月30日:平等与比较
- 2011年1月30日:更多章节标题
- 2011-01-30:提及与交换图的对应
- 2011-01-30:指向代码存储库。
继续阅读“打字数字”»
最近我一直在思考如何从高级规范中派生低级大规模并行程序。一个经常使用的工具是带有关联运算符的折叠(归约)。关联性。。。