Các kiểm tra kiểu chương trình sau đây nếu tôi xác định nó trên dòng lệnh (ví dụ ghci file.hs
):ghci - biên dịch háo hức ở chế độ tương tác?
import Data.Ratio
foo = let x = [1..]
y = (1%2) + (head x)
in y
Tuy nhiên, nếu tôi nhập nó một cách tương tác, tôi sẽ nhận được một lỗi type:
Prelude> import Data.Ratio
Prelude Data.Ratio> let x = [1..]
Prelude Data.Ratio> let y = (1%2) + (head x)
<interactive>:1:23:
Couldn't match expected type `Ratio a0' with actual type `Integer'
Nó có vẻ như x
đang được háo hức đánh máy là [Integer]
trái ngược với tổng quát hơn (Num t, Enum t) => [t]
.
Tôi có thể làm gì về điều đó không? Có những tình huống khác trong đó chế độ tương tác sẽ khác với chế độ hàng loạt không?
Hạn chế monomorphism ... – augustss
và nhập mặc định – Ptival
Thật vậy, đó là hạn chế monomorphism đáng sợ. Có hai cách xung quanh nó: cho chữ ký rõ ràng hoặc tắt hạn chế này (trong GHCi, bạn có thể làm ': set -XNoMonomorphismRestriction' và bạn đã hoàn thành; pragmas ngôn ngữ và cờ biên dịch cũng hoạt động). – Vitus