Data.Map - 为什么有 `takeWhileAntitone` 而没有 `takeWhile`?

afe*_*afe 2 containers dictionary haskell

我对Data.MapAPI 感到困惑。我正在寻找一种简单的方法来以成本价找到地图的一系列键log(n)。这是一个称为“二分搜索”或“二分查找”的基本概念。

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

阅读有关该主题的维基百科后,这似乎只是说,当按关键顺序应用于参数时,函数可能只有一个地方从True变为False。这符合二分搜索的要求。

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

  • 如果我的理解是正确的,并且
  • bisect没有调用这些函数或类似函数是否有原因binarySearch?

Li-*_*Xia 9

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

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

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

  • 这些函数不被称为 bisect、binarySearch 或类似函数有什么原因吗?
  1. 该名称用于区分takeWhileAntitone“进行二分搜索”dropWhileAntitone但spanAntitone最终结果不同的变体 , 。

  2. takeWhile是 Haskell 标准库中的一个众所周知的名称(在 参考资料中Data.List)。

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