【发布时间】: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..]中的无限列表上运行,在这种情况下,它会生成(无限)素数列表无需基本案例。