【问题标题】:How does Haskell scrap the boilerplate?Haskell 如何废弃样板文件?
【发布时间】:2011-09-12 03:56:48
【问题描述】:

我正试图围绕这篇文章展开我的头脑:

http://www.haskell.org/haskellwiki/Scrap_your_boilerplate

虽然我知道 fmap 和 functor 是什么(感谢"Learn you a haskell for great good"),但我还是无法理解这篇文章。有人可以简单地向我解释一下 Haskell 是如何废弃样板的吗?

【问题讨论】:

  • SYB 和其他泛型库在您设计 DSL 时最有用,特别是当您有多个构造函数的递归 data 声明时。例如。 data Language a = Statement (Language a) | Expr (Language a) | Var a | BinOp String (Language a) (Language a)。如果您不编写这样的代码,请不要担心 SYB。如果您想知道只是为了学习,请尝试先实现一种小语言,然后阅读 SYB 论文。我还发现 Uniplate 比 Syb 更容易理解。
  • @John L,我在想“废弃你的样板”是一个涉及高阶函数和泛型的通用概念,如果有人在 Haskell Wiki 上解释这些示例,我可以理解。但是看起来很难理解。
  • 与其说难以理解,不如说它是一种解决特定领域中一组特定问题的技术。如果您没有在问题领域工作,则不清楚 SYB 提供什么或为什么它有用。您可以尝试“Scrap Your Zippers”论文,这是使用泛型的一个特定案例。 cs.indiana.edu/~adamsmd/papers/scrap_your_zippers

标签: haskell


【解决方案1】:

如果您是 haskell 的新手,您可能根本不必担心 SYB。这不是基本的,甚至不是常用的(我自己从未使用过)。

SYB 是 Haskell 的一个库包,不是 Haskell 本身的一部分,甚至不是基础库之一。见这里:http://www.cs.uu.nl/wiki/GenericProgramming/SYB

您可能想通读(最后一篇论文)http://research.microsoft.com/en-us/um/people/simonpj/papers/hmap/

【讨论】:

  • 感谢您的链接。我希望我能看懂 Simon PJ 的论文。
【解决方案2】:

http://foswiki.cs.uu.nl/foswiki/GenericProgramming/SYB 可能是阅读有关 SYB 的更好资源(一些链接已损坏,因为 haskell.org 上的某些内容已更改 url,但其余的工作)。

为了一般性地回答您的问题,以下是主页上的引述:

数据类型泛型编程

数据类型泛型编程包括在数据类型的结构上定义函数,而不是在数据类型本身上。通过这种方式,可以定义适用于多种不同数据类型的函数。

在 SYB 中,数据类型的结构并不直接暴露给程序员。相反,泛型组合器用于定义泛型函数。这些组合器是使用 Data 和 Typeable 类的基本函数实现的。

【讨论】:

  • 你能举一些数据类型泛型编程的例子以及它是如何减少样板的吗?
  • 它“减少了样板”,您可以编写一个适用于 X 数据类型的函数,而不是 X 函数,每个函数都对单个数据类型执行相同的操作。作为一个非常通用的例子,假设你(出于某种原因)决定在haskell中实现一个链接列表——你可以使用像SYB这样的东西编写一个通用函数,它仍然可以对该列表和普通Haskell列表进行排序,返回正确的类型(如果您对“链表”进行排序,它将返回一个类似的“链表”,如果您对常规列表进行排序,它将返回一个常规列表)。
  • 了解泛型编程的优势。你能帮我理解 Haskell Wiki 中的例子吗?
  • @Amber:那个链表示例相当糟糕。普通类型类就足够了。
  • @John L,是的,老实说,我当时并没有受到启发。我碰巧使用的 SYB 类型的东西不足以提供一个很好的例子。 (尽管与标准的 haskell 列表相比,如果链接列表对给定元素具有不同的访问机制,那么仅仅依赖类型类就不会奏效。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 2019-03-21
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多