过滤两个列表的较大元素

Len*_*a H 3 haskell list filter

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

primes = [2, 3, 5, 7, 11, 13, 17]
-- keep  5 since  5² > 3*7
-- keep 11 since 11² > 7*13
Run Code Online (Sandbox Code Playgroud)

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

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)

Run Code Online (Sandbox Code Playgroud)

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

414*_*wen 5

您的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
Run Code Online (Sandbox Code Playgroud)

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

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