2017-10-10 106 views

回答

3

可以定義modPowInt -> Int -> Int -> Int,即,它接受和返回Int S(64位整數),因此所有的操作都模64個比特。

當您手動執行表達式時,GHCI將您的號碼上傳到Integer(它的大小無限制),產生正確的輸出。

+0

有沒有辦法做同樣的事情,而不改變簽名?謝謝 – trunks1ace

+0

不,如果返回類型的大小有限(64位),則不能返回無限的'Integer'類型.. – randomir

4

看錶達的類型,您使用:

> :t (13481503^2 `mod` 46340)^(11237126 `div` 2) 
(13481503^2 `mod` 46340)^(11237126 `div` 2) :: Integral a => a 

ghci默認爲Integer時用力要評估Integral a => a類型的值(與通過交互式解釋到show隱式調用發生),而你的函數返回一個Int

1

你正在提高5,618,563的能力。這是一個巨大的號碼。您可以用Int(假設它是一個有符號的64位整數)表示的最大數字是(2^63) - 1。由於5,618,563> 63,任何增加到500萬的功率都不能適合Int(除非「任何東西」是1,0或-1)。所以modPow :: Int -> Int -> Int -> Int將溢出

進入相同的操作沒有一個類型簽名將默認爲Integer,這並不侷限於64位的方式Int。所以計算不會溢出,並會給出真實的結果。不管你是在一個模塊還是在GHCi中,都會發生這種情況;你誤診了兩次測試之間的顯着差異。

相關問題