gpt4 book ai didi

Haskell 列表中最长的连续元素系列

转载 作者:行者123 更新时间:2023-12-02 18:23:14 24 4
gpt4 key购买 nike

我是函数式编程和 haskell 语言的新手。我试图根据谓词函数确定列表中最长连续元素系列的长度。该函数如下所示:

 longestSequence :: (a -> Bool) -> [Int] -> Int

当我这样调用它时:

 longestSequence (\x -> x >= 10) [1,44,33,22,2,3,55,66,66,77,88,99]

它应该给我作为解决方案6

到目前为止我的解决方案是:

longestSequence :: (a -> Bool) -> [a] -> Int
longestSequence p [] = 0
longestSequence p (x:xs)
| (p x) = 1 + (longestSequence p xs)
| otherwise = longestSequence p xs

关于如何解决这个问题有任何提示或想法吗?

最佳答案

尝试分解较小的子问题。对于这个例子,一般策略可能是这样的:

  1. 将给定列表转换为 [Bool] 列表,其中如果相应条目满足谓词,则该条目为 True。即编写一个函数 (Int -> Bool) -> [Int] -> [Bool]
  2. 对连续的 TrueFalse 值进行分组。即编写一个函数[Bool] -> [[Bool]]。您可能想查看Data.List.group .
  3. 过滤掉 False 组:[[Bool]] -> [[Bool]]
  4. 对于每个内部列表计算它们的长度。 [[Bool]] -> [Int]
  5. 找到这些长度的最大值:[Int] -> Int

然后你只需组合这些函数就可以了。对于 1. 和 4.,您将需要使用函数 map::(a -> b) -> [a] -> [b]。如果您已经知道map,就使用它吧。如果您不这样做,我建议您自己也写一下。

我给出的一些函数的类型签名过于具体。也许尝试尽可能地概括它们。

关于Haskell 列表中最长的连续元素系列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41389306/

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