簡體   English   中英

使用ghci交互運行Haskell代碼並將其作為模塊加載時,我得到不同的結果

[英]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 = 13481503k = 11237126m = 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM