Haskell 哈斯凯尔是如何把样板纸扔掉的?

Haskell 哈斯凯尔是如何把样板纸扔掉的?,haskell,Haskell,我正试图围绕这篇文章来思考: 尽管我知道什么是fmap,什么是函子(多亏了),我还是无法理解这篇文章。有人能简单地向我解释一下Haskell是如何删除样板文件的吗?也许是阅读SYB的更好资源(一些链接被破坏了,因为Haskell.org上的一些东西更改了URL,但其余的都可以) 为了大致回答您的问题,这里引用主页上的一段话: 数据类型泛型编程 数据类型泛型编程包括在数据类型的结构上定义函数,而不是在数据类型本身上定义函数。通过这种方式,可以定义适用于许多不同数据类型的函数 在SYB中,数据类型

我正试图围绕这篇文章来思考:

尽管我知道什么是fmap,什么是函子(多亏了),我还是无法理解这篇文章。有人能简单地向我解释一下Haskell是如何删除样板文件的吗?

也许是阅读SYB的更好资源(一些链接被破坏了,因为Haskell.org上的一些东西更改了URL,但其余的都可以)

为了大致回答您的问题,这里引用主页上的一段话:

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

在SYB中,数据类型的结构不会直接向程序员公开。相反,泛型组合符用于定义泛型函数。这些组合器是使用数据和可类型类中的基本函数实现的


如果你是haskell的新手,你可能根本不应该担心SYB。它不是基本的,甚至不是常用的(我自己从来没有用过)

SYB是Haskell的一个库包,不是Haskell本身的一部分,甚至不是基础库之一。请看这里:


您可能想通读(中的最后一篇论文)

您能给出一些数据类型通用编程的示例以及它是如何切割样板的吗?它“切割样板”的方式是,您可以编写一个对X个数据类型工作的函数,而不是X个函数,每个函数对单个数据类型执行相同的操作。作为一个非常普遍的例子,假设您(出于某种原因)决定在haskell中实现一个链表-您可以使用类似SYB的东西编写一个通用函数,该函数仍然可以对该链表和普通haskell链表进行排序,并返回正确的类型(如果您对“链表”进行排序,它将返回一个类似的“链表”),如果您对一个常规列表进行排序,它将返回一个常规列表)。你能帮我理解Haskell Wiki中的例子吗?@Amber:这个链表例子太差了。普通类型的类就足够了。@John L,是的,老实说,当时我并不是很有灵感。我没有使用足够的SYB类型的东西来准备一个好的例子。(尽管与标准haskell列表相比,如果链接列表对给定元素具有不同的访问机制,那么仅仅依赖类型类也不会奏效。)感谢链接。我希望我能理解Simon PJ的论文。SYB和其他泛型库在设计DSL时非常有用,特别是在使用多个构造函数进行递归
数据
声明时。例如,
数据语言a=语句(语言a)|表达式(语言a)|变量a |二进制字符串(语言a)(语言a)
。如果您不这样编写代码,那么还不用担心SYB。如果你想知道只是为了学习,试着先实现一种小型语言,然后阅读SYB论文。我还发现Uniplate比Syb更容易理解。@John L,我认为“废弃样板文件”是一个涉及高阶函数和泛型的通用概念,如果有人在Haskell Wiki上解释这些示例,我就能理解。但这看起来很难理解,与其说它很难理解,不如说它是一种解决某个领域特定问题的技术。如果您没有在问题领域工作过,那么还不清楚SYB提供了什么,或者它为什么有用。你可以试试“扔掉你的拉链”这张纸,这是使用仿制药的一个特例。