过滤两个列表的较大元素

我正在尝试编写一个 Haskell 程序,它输出一个素数列表,但只输出那些平方大于前一个和后一个素数的乘积的那些。例如,给定

primes = [2, 3, 5, 7, 11, 13, 17]
-- keep  5 since  5² > 3*7
-- keep 11 since 11² > 7*13

我的计划是创建正方形和相邻乘积的列表,然后使用过滤器仅输出素数列表中正方形大于相邻乘积的那些元素。这是我到目前为止

products :: [Int]
products = zipWith (*) primes (drop 2 primes)

squares :: [Int]
squares = zipWith (*) (drop 1 primes) (drop 1 primes)

goodPrimes :: [Int]
goodPrimes = filter (products, squares -> squares > products) (drop 1 primes)

一切正常,但goodPrimes 功能。我希望一切都清楚,有人可以帮助我。

回答

您的goodPrimeslambda 中有语法错误(参数之间的逗号)。

我们还需要配对您的乘积、正方形和素数列表的元素(使用zip3)。

primes :: [Int]
primes = [2, 3, 5, 7, 11, 13, 17]

squares :: [Int]
squares = zipWith (*) (tail primes) (tail primes)

products :: [Int]
products = zipWith (*) primes (drop 2 primes)

goodPrimes :: [Int]
goodPrimes = fmap ((prime, _, _) -> prime)
  $ filter ((prime, prod, square) -> square > prod)
  $ zip3 (tail primes) products squares

我们可以内联平方的计算以使其goodPrimes更清晰,然后我们可以删除squares

goodPrimes :: [Int]
goodPrimes = fmap fst
  $ filter ((prime, prod) -> prime * prime > prod)
  $ zip (tail primes) products
?> goodPrimes
[5,11]


以上是过滤两个列表的较大元素的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>