【问题标题】:Data.Map - why is there `takeWhileAntitone` but no `takeWhile`?Data.Map - 为什么有`takeWhileAntitone`但没有`takeWhile`?
【发布时间】:2021-12-12 19:40:32
【问题描述】:

我对@9​​87654321@ API 感到困惑。我正在寻找一种简单的方法来以log(n) 成本查找地图的一系列键。这是一个被称为“二分搜索”的基本概念,也可能是“二分法”。

我看到了这个奇怪的takeWhileAntitone 函数,我需要在其中提供一个“反调”谓词函数。这是我第一次遇到这个概念。

在阅读了有关该主题的 Wikipedia 之后,这似乎只是在说,当按键顺序应用于参数时,函数可能只有一个地方从 True 变为 False。这符合二分查找的要求。

由于 API 是用一种奇怪的(对我而言)语言记录的,我想在这里问一下:

  • 如果我的理解是正确的,并且
  • 这些函数不称为bisectbinarySearch 或类似名称是否有原因?

【问题讨论】:

  • 您正在为您的特定用例寻找split,或者可能是splitLookup,具体取决于您的范围是否包含在内。
  • @LouisWasserman,我认为*Antitone 函数非常适合此目的,除非您对我们其他人不了解的应用程序有所了解。这完全取决于所需的信息。
  • "A range of keys for the map" 表明 OP 只是在寻找 map 与一系列键 [a, b] 等的交集,并且 split 明确设计用于破坏映射到范围一侧的键。
  • @LouisWasserman, split 用于特定键两侧的独占范围,如果存在则将其删除。 spanAntitone 将所有条目留在其结果中。因此,您想要哪种取决于哪种行为对您有用。 spanAntitone 通常更灵活,因为它可以执行 spanAntitone isLeft 之类的操作。

标签: dictionary haskell containers


【解决方案1】:

由于 API 是用一种奇怪的(对我而言)语言记录的,我想在这里问一下:

  • 如果我的理解是正确的,并且

是的。 takeWhileAntitone(以及库中其他类似命名的变体)是对键进行二进制搜索的函数。它没有被命名为takeWhile,因为它不适用于任何参数谓词,所以如果您正在查看代码,它会提醒您检查。

  • 这些函数不称为 bisect、binarySearch 或类似函数是否有原因?
  1. 此名称用于区分“进行二分搜索”但最终结果不同的变体 takeWhileAntitonedropWhileAntitonespanAntitone

  2. takeWhile 是 Haskell 标准库(在 Data.List 中)的一个知名名称。

  3. 在 FP 中,我们喜欢区分“什么”和“如何”。 “二分搜索”是一种算法(“如何”)。 “take while”在字面上也是“如何”,但可以说它的含义更自然地与“什么”(满足谓词的元素的最长前缀)相关联。特别是,将“take while”解释为“最长前缀”并不依赖于关于谓词的任何假设。

【讨论】:

  • 容器包中的地图绝对是二叉树(亚当斯树/有界平衡树),而不是手指树。
  • 啊,哎呀,我在序列上工作太多了!
猜你喜欢
  • 2021-03-20
  • 2016-09-22
  • 2014-04-26
  • 2020-07-07
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多