gpt4 book ai didi

collections - Haskell "collections"语言设计

转载 作者:行者123 更新时间:2023-12-03 12:07:34 32 4
gpt4 key购买 nike

为什么 Haskell 实现如此专注于链表?

例如,我知道 Data.Sequence 效率更高
大多数列表操作(cons 操作除外),并且被大量使用;
但是,从语法上讲,它“几乎不受支持”。 Haskell 在函数抽象上做了很多努力,比如 Functor 和 Foldable 类,但是它们的语法与默认列表的语法不兼容。

如果在一个项目中我想优化并用序列替换我的列表 - 或者如果我突然想要支持无限集合,并用列表替换我的序列 - 结果代码更改是可恶的。

所以我想我的疑惑可以具体化为以下问题:

  • 为什么不是 map 的类型等于 (Functor f) => (a -> b) -> f a -> f b ?
  • 为什么 [] 不能和 (:)例如,函数可用于 Data.Sequence 中的类型?

  • 我真的希望对此有一些解释,不包括“向后兼容性”或“它只是这样增长”等词,但如果您认为没有,请告诉我。也欢迎任何相关的语言扩展。

    最佳答案

    在了解原因之前,这里是问题的摘要以及您可以采取的措施。构造函数[](:)为列表保留,不能重新定义。如果您计划对多个数据类型使用相同的代码,则定义或选择一个表示您要支持的接口(interface)的类型类,并使用该类中的方法。
    以下是一些适用于列表和序列的通用函数。我不知道 (:) 的概括,但你可以自己写。

  • fmap而不是 map
  • mempty而不是 []
  • mappend而不是 (++)

  • 如果您打算进行一次性数据类型替换,那么您可以为事物定义自己的名称,并在以后重新定义它们。
    -- For now, use lists
    type List a = [a]
    nil = []
    cons x xs = x : xs

    {- Switch to Seq in the future
    -- type List a = Seq a
    -- nil = empty
    -- cons x xs = x <| xs
    -}
    请注意 [](:)是构造函数:您也可以将它们用于模式匹配。模式匹配特定于一种类型构造函数,因此您无法在不重写模式匹配代码的情况下扩展模式以处理新数据类型。

    为什么 Haskell 中有这么多特定于列表的东西
    列表通常用于表示顺序计算,而不是数据。在命令式语言中,您可以构建一个带有循环的 Set,该循环创建元素并将它们一个一个插入到集合中。在 Haskell 中,您可以通过创建一个列表然后将该列表传递给 Set.fromList 来执行相同的操作。 .由于列表与这种计算抽象非常接近,因此它们的位置不太可能被另一种数据结构所取代。
    事实仍然是,有些函数本来可以是通用的,但它们是特定于列表的。一些常用功能,如 map被制作为特定于列表的,以便新用户学习的内容更少。特别是,它们提供了更简单且(已决定)更易于理解的错误消息。由于可以改用泛型函数,因此问题实际上只是语法上的不便。值得注意的是,Haskell 语言的实现几乎没有特定于列表的代码,因此新的数据结构和方法可以与“内置”的一样高效。
    有几个类是列表的有用概括:
  • 仿函数 用品fmapmap 的概括.
  • Monoid 提供对具有类列表结构的集合有用的方法。空列表[]mempty 推广到其他容器, 和列表连接 (++)mappend 推广到其他容器.
  • 申请单子(monad) 提供有助于将集合解释为计算的方法。
  • 可遍历 可折叠为在集合上运行计算提供有用的方法。

  • 其中,只有 Functor 和 Monad 在有影响力的 Haskell 98 规范中,因此库编写者在不同程度上忽略了其他的,这取决于库的编写时间和维护的积极程度。核心库在支持新接口(interface)方面做得很好。

    关于collections - Haskell "collections"语言设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4180822/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com