2010年7月存档

拉链的另一个角度

zippers是一种高效、优雅的数据结构,用于纯功能编辑树状数据结构,由杰拉德·休特首次出版拉链在树中维护焦点位置,并支持导航操作(上、下、左、右)和编辑(替换当前焦点)。

最初的拉链类型和操作是为单个类型定制的,但不难看出如何适应其他类似树的类型,从而适应常规数据类型。有许多后续文件拉链,包括论文中的多类型版本类型标识的数据类型

到目前为止,我看到的所有拉链调整和概括都保持了原来的导航界面。在这篇文章中,我提出了一个替代接口,似乎可以大大简化问题。只有两个而不是四个导航功能,这两个功能中的每一个都是通过相当简单的一行程序指定和实现的。

我还没有在应用程序中使用这个新的拉链公式,所以我不知道在简化界面时是否已经失去了一些用处。

本文中的代码取自Haskell库函数-命令并完成霍利中引入的类型类高阶类型的区分

编辑:

  • 2010年7月29日:移除一些流浪者只是中的应用程序向上的定义。(谢谢,伊利西斯。)
  • 2010年7月29日:增加了我对调整2使用Sjoerd Visscher的一个简单得多的版本。
  • 2010年7月29日:更换fmap(第一个(:ds'))具有(fmap.first)(:ds’)在里面向下定义。(谢谢,Sjoerd。)

继续阅读“拉链的另一个角度”»

高阶类型的区分

“单孔上下文”是缺少一个片段的数据结构。Conor McBride指出正则类型的导数是它的单孔上下文类型当数据结构由普通函子组合子组合而成时,相应类型的单孔上下文可以通过规则机械地导出,这些规则反映了初等微积分中学习的标准导数规则。

我最近一直在玩函子组合子。我很高兴地发现,数据结构导数可以使用标准函子组合子和类型族直接表示。

本文中的代码取自Haskell库函数-命令

另请参见Haskell Wikibooks拉链页面,尤其是名为“数据类型的差异化”的部分。

我的意思是,这篇文章并不是一项新的研究,而是对康纳令人愉快的见解的一个简洁、具体的介绍。

继续阅读“高阶类型的区分”»

非严格记忆的详细信息,第1部分

非严格记忆,我草拟了一种记忆非严格函数的方法。我给出了基本的见解,但没有展示非严格记忆库是如何组合在一起的细节。在这篇新文章中,我给出了一些细节,这些细节有点微妙,涉及到高阶类型的优雅记忆

接近尾声时,我遇到了一些常规数据类型的问题,我不知道如何干净有效地解决这些问题。

编辑:

  • 2010年9月10日:修复了小错误。

继续阅读“非严格记忆的细节,第1部分”

记忆高阶函数

记忆以增量方式将函数转换为数据结构。当一个函数被重复应用于相同的参数,并且应用该函数比访问相应的数据结构更昂贵时,它会得到回报。

惰性函数记忆化,从指称的角度来看,从函数到数据结构的转换是一次性的,从操作的角度来看是增量的。请参见优雅的备忘录功能高阶类型的优雅记忆

正如Ralf Hinze在广义Tries的推广,基于trie的记忆遵循涉及函数类型的三个简单同构:

1 →  ≅ 

( + b条) → c(c) ≅ (c(c)) × (b条 → c(c))

(×b条) → c(c) ≅  → (b条 → c(c))

这与我们熟悉的指数定律相对应

a ^1=a

c(c) + b条=c(c)× c(c)b条

c(c)× b条 = (c(c)b条)

当作为从左到右的转换应用时,每个定律都简化了函数类型的域部分。重复应用这些规则,然后消除所有函数类型或将其减少为原子类型的函数。这些原子域也可以通过附加的映射来消除,例如自然数和位列表之间的映射(如帕特里夏树). 与乘积和等相对应的代数数据类型被和和乘积规则消除。递归代数数据类型(列表、树等)会产生相应的递归trie类型。

因此,通过一些简单而熟悉的规则,我们可以在无限多种常见类型上记忆函数。我们错过了吗?

对。函数胜于函数呢?

编辑:

  • 2010年7月22日:使记忆示例具有多态性,并从成对切换到列表。旧示例意外地与特里自身。
  • 2011年2月27日:更新了一些符号

继续阅读“记忆高阶函数”»

高阶类型的优雅记忆

不久前,我对函数式记忆产生了兴趣,尤其是在看到斯宾塞·詹森(Spencer Janssen)使用了拉尔夫·欣泽(Ralf Hinze)论文的基本思想编写的一些代码之后广义Tries的推广博客帖子优雅的备忘录功能描述了一个库,备忘录Trie,并使用关联的数据类型我宁愿使用关联的类型同义词和标准类型,但我看不出如何处理细节。最近,在玩函子组合子的时候,我意识到它们可能对记忆有用,它们做得很好。

这篇博客文章展示了函子组合子如何导致函数记忆的更优雅的形式。该代码作为函数-命令包裹。

这篇帖子中的技巧并不是什么新鲜的东西,而是我最近逐渐熟悉的技巧。请参见广义Tries的推广,以及具有互递归数据类型不动点的泛型编程

编辑:

  • 2011-01-28:修复了小字体:“b^^a(美元)^^” ⟼ “b条
  • 2010年9月10日:修正施工要使用的定义新类型而不是数据
  • 2010年9月10日:添加缺失单位类型定义(作为施工()).

继续阅读“高阶类型的优雅记忆”»

非严格记忆

我写了一些关于函数记忆的帖子其中一个卢克·帕尔默评论说,记忆方法只适用于严格的函数,这是我以前没有注意到的。在本文中,我纠正了这个缺陷,将正确的记忆扩展到了非限制函数。的语义概念最小上界(可以用明确的选择)起着至关重要的作用。

编辑:

  • 2010年7月13日:修复了非严格记忆示例以使用参数未定义()如预期。
  • 2010年7月23日:拼写从“nonstrict”改为更流行的“nonstrit”。
  • 2011年2月16日:修复了轻微的打字错误。(“结果约束”→“结果类型约束”)

继续阅读“非标准备忘录”»