【发布时间】:2016-09-24 00:05:01
【问题描述】:
我正在努力将我对 Eratosthenes 筛的定义翻译成 Idris。这是到目前为止的功能:
%default total
eratos : Nat -> (l : List Nat) -> { auto ok: NonEmpty l } -> List Nat
eratos limit (prime :: rest) =
if prime * prime > limit -- if we've passed the square root of n
then prime :: xs -- then we're done!
-- otherwise, subtract the multiples of that prime and recurse
else prime :: (eratos limit (rest \\ [prime^2,prime^2+prime..limit]))
main : IO ()
main = printLn $ eratos [2..100]
不幸的是,我遇到了一个奇怪的编译器错误:
idris --build euler.ipkg
./E003.idr:18:18: error: expected: ")",
dependent type signature
else prime :: (eratos n (xs \\ [prime^2,prime^2+prime..n]))
为什么编译器要寻找类型签名?
【问题讨论】:
-
没有
(^)函数。你需要一些括号:[prime*prime,(prime*prime+prime) .. limit]
标签: primes sieve-of-eratosthenes idris