首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SML:故障跟踪Sieve函数

SML:故障跟踪Sieve函数
EN

Stack Overflow用户
提问于 2015-08-14 23:37:26
回答 1查看 53关注 0票数 0

我对一个寻找素数的函数感到有点困惑。我得到了以下信息:

代码语言:javascript
复制
fun divides x y = (y mod x = 0);

fun sieve [] = []
    | sieve(x::L) = x::sieve(filter (not o (divides x)) L);

sieve中,我知道divides xdivides的部分应用程序。它只返回一个函数,该函数检查传递给它的内容是否可被x整除。

假设我调用sieve([2, 3, 4, ..., 10])

然后在第一次递归调用时,我会得到

代码语言:javascript
复制
2::sieve(filter(not o (divides 2)) [3, 4, 5, ..., 10])

2::sieve([3, 5, 7, 9])

2::3::sieve(filter(not o (divides 3)) [5, 7, 9])

2::3::sieve([5, 7])

2::3::5::sieve(filter(not o (divides 5)) [7])

2::3::5::7

这样看起来对吗?

谢谢你的检查,

bclayman

EN

回答 1

Stack Overflow用户

发布于 2015-08-15 00:10:43

您的理解是正确的(尽管您的最后一行应该是2::3::5::7::[])。这段代码似乎是对famous piece of Haskell code的SML修改。在Haskell版本中,primes被定义为一个概念上无限的惰性列表(例如,take 100 primes会给你前100个素数)。我在上面给出的链接很好地解释了基本逻辑(这并不严重依赖于惰性列表)。有多种方法可以在SML中实现惰性列表。有趣的是,您可能想尝试制作一个更接近Haskell版本的SML版本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32013747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档