use*_*220 5 haskell integer prime-factoring
为什么打印的负数为-147982099而不是8462696833 = 600851475143/71
import Data.List
smallFactor n = case (elemIndex 0 (map (mod n) [2..])) of
Just x -> x + 2
main = print( quot n (smallFactor n) )
where n = 600851475143
Run Code Online (Sandbox Code Playgroud)
完整输出:
$ ghc --make p3; ./p3
[1 of 1] Compiling Main ( p3.hs, p3.o )
Linking p3 ...
-147982099
Run Code Online (Sandbox Code Playgroud)
Tho*_*son 11
因为你告诉它一个负数(假设你使用的是32位GHC).
where n = 600851475143 -- n = -443946297
Run Code Online (Sandbox Code Playgroud)
注意:
Prelude Data.Int> 600851475143 :: Int32
-443946297
Run Code Online (Sandbox Code Playgroud)
luq*_*qui 11
Haskell通常默认Integer为可以自由选择要使用的整数类型.但在这里我们看到了Int.原因是:
elemIndex :: Eq a => a -> [a] -> Maybe Int
Run Code Online (Sandbox Code Playgroud)
所以,x在Just x -> x + 2为一个Int,这意味着smallFactor必须返回一个Int,这意味着n在main必须是一个Int原因quot :: Integral a => a -> a -> a.
这是使用显式类型签名的一个很好的理由.
| 归档时间: |
|
| 查看次数: |
283 次 |
| 最近记录: |