[英]Haskell Could not find module 'Random' when running GHCI, what should I do
[英]I am getting different results when running my Haskell code interactively using ghci and when loading it as a module
從.hs文件加載的代碼:
modPow :: Int -> Int -> Int -> Int
modPow a k m = (a^2 `mod` m)^(k `div` 2)
交互輸入的代碼:
(13481503^2 `mod` 46340)^(11237126 `div` 2)
即a = 13481503
, k = 11237126
, m = 46340
在ghci中調用時,前者返回一個完全不同的數字,具有相同的值,即modPow 13481503 11237126 46340
查看您使用的表達式類型:
> :t (13481503^2 `mod` 46340)^(11237126 `div` 2)
(13481503^2 `mod` 46340)^(11237126 `div` 2) :: Integral a => a
當強制評估類型為Integral a => a
的值時, ghci
默認為Integer
(與交互式解釋器show
的隱式調用一樣),而函數返回Int
。
您將modPow
定義為modPow
Int -> Int -> Int -> Int
modPow
Int -> Int -> Int -> Int
modPow
Int -> Int -> Int -> Int
,即它接受並返回Int
(64位整數),因此所有操作都是64位模。
當您手動執行表達式時,GHCI會將您的數字向上轉換為Integer
(大小不受限制),從而產生正確的輸出。
您正在提高力量5,618,563。 這是一個巨大的數字。 您可以用Int
表示的最大數字(假設它是一個有符號的64位整數)是(2 ^ 63) - 1
。 因為5,618,563> 63,所以任何加到500萬的冪都不能放入Int
(除非“任何”為1、0或-1)。 所以modPow :: Int -> Int -> Int -> Int
將會溢出
輸入沒有類型簽名的相同操作將默認為Integer
,不限於Int
64位。 因此,計算不會溢出,並且會給出真實的結果。 無論您是在模塊中還是在GHCi中進行此操作,都會發生這種情況。 您誤診了兩次測試之間的顯着差異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.