【问题标题】:Type patterns and generic classes in HaskellHaskell 中的类型模式和泛型类
【发布时间】:2010-07-02 02:52:30
【问题描述】:

我试图理解 Haskell 中的类型模式和泛型类,但似乎无法理解。

谁能通俗地解释一下?

[1] 我读到过

“为了将函数通用地应用于所有数据类型,我们以统一的方式查看数据类型:除了基本的预定义类型,例如 Float、IO 和 →,每个 Haskell 数据类型都可以被视为可能标记的标记和产品。”

然后提到Unit:*::+:。 Haskell 中的所有数据类型是否都是上述的自动版本,如果是,我如何确定特定数据类型是如何用:*: 等表示的? haskell.org 上的泛型类用户指南(第 7.16 章)没有提到预定义类型,但如果类型模式应该详尽无遗,难道不应该在每个函数中处理它们吗?

[1] 比较 Haskell、Ralf Hinze、Johan Jeuring 和 Andres Löh 中的泛型编程方法

【问题讨论】:

    标签: generics reflection haskell


    【解决方案1】:

    他们是手工完成的。它类似于布尔代数中使用的“乘积之和”形式。由于每个代数数据类型都是由和和乘积构成的,因此转换可能与布尔代数中的转换非常相似,只是在这种情况下,它们会提取结构并丢弃一些语义。

    他们的例子是List a,最初定义为

    data List a = Nil | Cons a (List a)
    

    但转化为

    data List a = Unit :+: (a :*: (List a)).
    

    我只是略读了这篇论文,但我可以看到从声明中提取类型构造函数并使用 +* 运算符构建所有内容的一些价值。

    在他们使用这些更通用的结构类型之前,他们定义了一个同构以表明它们确实是相同的。它们还包括带有记录和构造函数名称的标签,我将不再赘述:

    from Nil = Unit
    from (Cons x y) = x :*: y
    to Unit = Nil
    to (x :*: y) = Cons x y
    

    【讨论】:

    • 好的。因此,如果我想使用泛型类,我需要根据:+: &c 定义所有内容,但{| ... |} (...) 是什么?我了解它的案例,但我不明白我得到了哪些案例。我想我了解{| a :+: b |} (Inr y){| Unit |} Unit,但我不了解{| a :+: b |} (1:b){| Unit |} bs。另外两个问题:如果我开始重新定义List,是否所有在Lists 上的模式匹配都会中断,甚至可以重新定义数据类型吗?
    【解决方案2】:

    好的,你可能不喜欢听这个,但你需要听听。 这是一篇研究论文。这不是关于如何完成它的说明手册或备忘单。这是对如何以使用 Haskell 已经为您提供的新形式进行的具体探索(即,它不是标准库......然而......这是一种制作方法,一次,所以你不需要稍后再做)。

    这就像您编写代码来创建堆栈或队列一样 - 这是一个练习。如果您可以将其用于真实的事情,那么您将获得更大的力量,但总的来说,它是一个说明或您可以用该语言做什么,而不是说明您应该如何做。

    这并不是说这篇论文只是一个玩具练习,永远不会用于任何重要的事情,只是他们的目的是展示如何组织你的程序,这样你就不会编写太多的样板文件,或重复自己,不费吹灰之力。

    至于 {|...|}(...) 的东西,这是作者谈论类型和该类型的值的方式。具体来说,{|...|} 是作者将类型表示为值的一种方式。这只是挥舞着悬而未决的思想实验。这是玩“让我们假装”的一种复杂方式。作者说,“看,Haskell 真的不允许我们将类型传递给函数,所以我们将使用这种形式作为一种简写方式来表达,“记住整个我们刚刚通过的部分展示了如何获得具有所有 Con(structor) 和 Label 类型的类型的表示?好吧,假设我们这样做了,某些类型的结果 a 就是我们所说的 {|a|}。”这是一个表示函数(编码、解码、映射、showP 等)正在获取的符号,并使用某些术语的类型和值。

    关于您的其他问题:

    1. 不是所有的模式匹配都超过 Lists 如果我开始重新定义就会中断 List? 如果您以不再匹配其“当前”定义的方式重新定义它,那么它当然会! (提示:这就是 {|...|} 表单的重点:你的函数知道你在玩什么类型,所以它也知道如何玩它!;)

    2. 是否可以重新定义数据 类型? 当然是! (我感觉就像#haskell @FAQ 回答者,在这里...)见上面的提示。 :)

    我希望这能回答你的问题。如果你有更多问题,或者想和一个活生生的人一起讨论,你可以随时访问 freenode 上的 IRC 频道(以防你不知道我为什么在上面的句子)。 非常友好和乐于助人的人,让到处都是巨魔感到沮丧! :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-01
      • 2011-08-15
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      相关资源
      最近更新 更多