【发布时间】:2018-03-04 17:52:57
【问题描述】:
所以我花了最后一个小时左右尝试编写一个有效的 haskell 函数来检查一个数字是否是素数。我想出了这个我很满意的算法:
prime :: Int -> Bool
prime x
| x == 1 = False
| x == 2 = True
| x == 3 = True
| x `mod` 2 == 0 = False
| x `mod` 3 == 0 = False
| otherwise = all (\y -> x `mod` y /= 0) $ dividends x
where
dividends z =
takeWhile ((<=) . floor . sqrt . fromIntegral $ z)
$ concatMap (\x -> [x-1, x+1]) [6 * x | x <- [1..]]
我还上传了一个笔记本,它检查算法的运行时间并将其与筛法进行比较,以防有人感兴趣:https://anaconda.org/freemo/primes/notebook
我的问题是,作为 haskell 的新手,我怎样才能使这个算法更加符合规范。我感觉可以消除我使用的匿名函数,并且可能还有其他方法可以使其更简洁,而不会对运行时间产生负面影响。我怎样才能用更惯用的 haskell 方式写这个?
【问题讨论】: