gpt4 book ai didi

haskell - 是否有一个直接的解决方案来接收元素 *prior* 击中 dropWhile 谓词?

转载 作者:行者123 更新时间:2023-12-03 14:56:27 27 4
gpt4 key购买 nike

给定一个条件,我想搜索一个元素列表并返回第一个达到条件的元素和前一个元素。

在 C/C++ 中,这很容易:

int i = 0;
for(;;i++) if (arr[i] == 0) break;

我们得到满足条件的索引后,就很容易得到前一个元素,通过“ arr[i-1]

在 haskell :
  • dropWhile (/=0) list给了我们我想要的最后一个元素
  • takeWhile (/=0) list给了我们我想要的第一个元素

  • 但我看不到以简单的方式获得两者的方法。我可以枚举列表并使用索引,但这似乎很乱。有没有正确的方法来做到这一点,或者解决这个问题的方法?

    最佳答案

    我会用它的尾部压缩列表,这样你就有成对的元素
    可用的。然后你可以使用 find在对列表中:

    f :: [Int] -> Maybe (Int, Int)
    f xs = find ((>3) . snd) (zip xs (tail xs))

    > f [1..10]
    Just (3,4)

    如果第一个元素与谓词匹配,这将返回 Nothing (或第二场比赛,如果有的话)所以如果你想要一些东西,你可能需要特殊情况
    不同的。

    正如 Robin Zigmond 所说 break也可以工作:
    g :: [Int] -> (Int, Int)
    g xs = case break (>3) xs of (_, []) -> error "not found"
    ([], _) -> error "first element"
    (ys, z:_) -> (last ys, z)

    (或者也可以返回 Maybe,这取决于您的需要。)

    但我认为,这将保留整个前缀 ys在内存中直到它
    找到匹配项,而 f可以开始垃圾收集元素
    它已经过去了。对于小列表,这并不重要。

    关于haskell - 是否有一个直接的解决方案来接收元素 *prior* 击中 dropWhile 谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56020299/

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