【发布时间】:2014-08-21 03:57:50
【问题描述】:
这个问题现在对我来说是严格的学术问题,但有一天我会看到它有实际应用。通过 Haskell 自学,我成功地构建了无限的素数列表。其中一部分是这个函数:
isPrime n
| n < 2 = False
| head (primeFactorsOf n) == n = True
| otherwise = False
其中primeFactorsOf 以升序返回数字的质因数列表。 1 不是素数,所以素数n 的素数是单例列表[n]。因此,第二个保护案例可以替换为:
| primeFactorsOf n == [n] = True
其中一个比另一个更有效吗?如果不是,是一种更好的风格吗?我的直觉是调用 head 并比较两个简单的数字比调用 cons 并比较两个单例列表要快,所以我已经得到的将是最好的。但如果没有区别,我认为替代方案看起来更干净。
【问题讨论】:
-
我不认为这是你的算法的一部分,速度真的很重要,GHC 可能会优化一点。也就是说,我认为第一个很好。或者您可以编写一个
smallestPrimFactor函数,该函数仅在primeFactorsOf n上使用模式匹配,使其更具可读性和可理解性。 -
只是一个旁注。
| foo = bar | xyz = True | otherwise = False写成| foo = bar | otherwise = xyz可能更好。 -
@n.m.奇怪的是,这是我在任何命令式语言中默认会做的事情,但我花了大约 30 秒才弄清楚你可能的意思! Haskell 的第一步是“忘掉一切”。我确定第 3 步将是“忘记第 1 步”。
标签: performance list haskell comparison