【问题标题】:Modify haskell function to run correctly修改haskell函数以正确运行
【发布时间】:2018-06-29 15:06:47
【问题描述】:

我有以下haskell代码:

a (b : bs) = b : [c | c <- (a bs), c `rem` b /= 0]

谁能解释这段代码的作用? 运行 as

a [3,5..42]

返回

  Prelude> a [3,5..42]
[3,5,7,11,13,17,19,23,29,31,37,41*** Exception: <interactive>:71:1-46: Non-exhaustive patterns in function a

据我所知,该函数的工作原理类似于埃拉托色尼筛。该函数将 b 视为素数并过滤掉 b 的倍数。但我不确定如何。最重要的是,该函数会引发此异常。

【问题讨论】:

  • 您可能应该添加一个基本案例a [] = []
  • 请注意,此函数可能打算a [2..]a [3,5..] 中的无限列表上运行,在这种情况下,它会生成(无限)素数列表无需基本案例。

标签: list haskell primes


【解决方案1】:

这里有一个递归函数:您在定义中调用a bs。最终 bs 将是空列表,此时您会遇到异常。例如,您可以在代码中添加以下行:

a [] = []

那么输出会变成:

[3,5,7,11,13,17,19,23,29,31,37,41]

至于这个函数的作用,它返回列表中的每个元素,而不是列表中任何先前元素的倍数。如果给它一个列表[2..x],其中x 是任何整数,这与从2x 的所有素数列表相同。

获取素数列表的另一种方法是您找到的方法: 你从 3 开始,让 Haskell 列表理解跳过任何 2 的倍数。

【讨论】:

  • 次要:我宁愿说“它生成”或“它输出”而不是“它打印”,因为该函数本身不涉及 I/O,它只返回新列表. (+1)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2021-11-23
  • 2014-10-14
  • 1970-01-01
相关资源
最近更新 更多