2016-08-31 80 views

回答

0

我想這只是簡單Monomorphism restriction。如果沒有指定實際類型,則將像Num a => a這樣的多態類型處理爲Integer。也許這個規則也適用於ghci,你會看到整型而不是一些未知類型的變量。

UPD 1:實際上這個用戶指南的這部分包含的真正的答案是關於defaulting rules

UPD 2:Random類型的案件變得比我預期的更困難。所以在這種情況下,由於default (Integer, Double)聲明(在報告中聲明),違約規則已解決。考慮下一個ghci會話

Prelude System.Random> default() 
Prelude System.Random> randomIO 

<interactive>:6:1: 
    No instance for (Show (IO a0)) arising from a use of ‘print’ 
    In a stmt of an interactive GHCi command: print it 
Prelude System.Random> default (Integer) 
Prelude System.Random> randomIO 
-7948113563809442883 
Prelude System.Random> default (Double) 
Prelude System.Random> randomIO 
0.41581766590151104 
+3

從技術上講,除非有函數聲明,它不是單態的約束,而只是潛在的默認規則。單態限制是關於默認規則如何應用於函數定義。 – Guvante

+0

我有一個快速查看鏈接; 「默認情況下,在編譯的模塊中啓用了限制,並且在GHCi提示符下(自GHC 7.8.1開始)默認關閉。」看起來它在ghci中關閉了。 (我正在使用ghci 7.10.3。) –

+0

@AlbertNetymk是的,正如上面的評論所說,限制和違約規則是不同的東西。所以限制被關閉,但違約規則仍然適用。看到這個鏈接:https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ghci.html#type-defaulting-in-ghci – Shersh