gpt4 book ai didi

haskell 从无限数字列表中过滤(减少)重复序列的优雅方法

转载 作者:行者123 更新时间:2023-12-04 08:22:26 27 4
gpt4 key购买 nike

这是一个产生无限随机数列表的函数

import System.Random
values :: [Int]
values = map fst $ scanl (\(r, gen) _ -> randomR (1,10) gen) (randomR (1,10) (mkStdGen 1)) $ repeat ()
我想将重复元素的序列减少为一个元素,例如
[2,3,4,1,7,7,7,3,4,1,1,1,3,..] -> [2,3,4,1,7,3,4,1,3 ,..]
所以,我需要一些优雅的函数 "f"从 [Int] -> [Int] 这样做。
此外,它必须懒惰地使用无限列表,所以如果我运行
f values
它一定不能挂起并实时输出数据

最佳答案

您可以与 group :: Eq a => [a] -> [[a]] 合作制作组列表。所以对于给定的样本数据,这将生成:

Prelude> import Data.List(group)
Prelude Data.List> group [2,3,4,1,7,7,7,3,4,1,1,1,3]
[[2],[3],[4],[1],[7,7,7],[3],[4],[1,1,1],[3]]
然后我们可以为每个子列表只产生 head 的第一个元素,我们知道这样的元素存在,否则它永远不会首先构造一个新的组:
Prelude Data.List> map head (group [2,3,4,1,7,7,7,3,4,1,1,1,3])
[2,3,4,1,7,3,4,1,3]
这意味着您可以定义 f作为:
import Data.List(group)

f :: Eq a => [a] -> [a]
f = map head . group
这也适用于无限列表。例如,如果我们以无限列表 5 结束列表s,然后它处理列表直到那个 5 并继续寻找一个新值:
Prelude Data.List> map head (group (2 : 3 : 4 : 1 : 7 : 7 : 7 : 3 : 4 : 1 : 1 : 1 : 3 : repeat 5))
[2,3,4,1,7,3,4,1,3,5
或者我们可以使用 group :: (Foldable f, Eq a) => f a -> [NonEmpty a] Data.List.NonEmpty :
import Data.List.NonEmpty(group)
import qualified Data.List.NonEmpty as NE

f :: Eq a => [a] -> [a]
f = map NE.head . group

关于haskell 从无限数字列表中过滤(减少)重复序列的优雅方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65437663/

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