gpt4 book ai didi

list - 有没有一种懒惰的方法来编写减号函数(从列表中删除项目)?

转载 作者:行者123 更新时间:2023-12-04 13:29:26 24 4
gpt4 key购买 nike

我的功能如下所示:

minus :: (Eq a) => [a] -> [a] -> [a]
minus [] xs = []
minus (y:ys) xs | y `notElem` xs = y : (minus ys xs)
| otherwise = minus ys xs

它可以这样使用:
[99,44,55,22,23423] `minus` [55,22]

输出: [99,44,23423]
我写这篇文章是因为我正在研究 Project Euler 问题 7,Eratosthenes 筛似乎是正确的工具,而且确实如此,但我一直在阅读 Wikipedia page并谈到了欧拉的筛子。

我试图复制/粘贴代码并在 GHCi 中运行它,但我的 GHCi 版本没有名为 Data.OrdList 的模块,我找不到名为 minus 的函数在霍格尔。

这是来自维基百科的代码:
 import Data.OrdList (minus)

primes = euler [2..]
euler (p : xs) = p : euler (xs `minus` map (*p) (p : xs))

如果我在那里替换减号函数,则会出现内存不足错误,因为我的函数不是惰性的。

有没有办法制作一个惰性减法函数?

我的减号功能是否与维基百科文章中的减号功能相同?

最佳答案

正如 sepp2k 指出的,minus 的实现必须假设有序列表。这是一个可能的实现:

minus :: Ord a => [a] -> [a] -> [a]
minus [] _ = []
minus xs [] = xs
minus l1@(x:xs) l2@(y:ys)
| x > y = minus l1 ys
| x < y = x : minus xs l2
| otherwise = minus xs l2

关于list - 有没有一种懒惰的方法来编写减号函数(从列表中删除项目)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3842078/

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