TL; DR: Đó là một loại vô nghĩa bị cắt xén không đáng lo ngại.
Các chữ số nguyên có thể đại diện cho các giá trị của bất kỳ loại nào thực hiện các kiểu chữ Num
. Vì vậy, 1
hoặc bất kỳ chữ số nguyên nào khác có thể được sử dụng ở bất cứ nơi nào bạn cần một số.
doubleVal :: Double
doubleVal = 1
intVal :: Int
intVal = 1
integerVal :: Integer
integerVal = 1
Điều này cho phép chúng tôi sử dụng linh hoạt các chữ số nguyên trong bất kỳ ngữ cảnh số nào.
Khi bạn chỉ sử dụng một chữ số nguyên mà không có bất kỳ ngữ cảnh kiểu nào, ghci không biết loại đó là gì.
Prelude> :type 1
1 :: Num a => a
ghci đang nói "rằng '1' là của một số loại I không biết, nhưng tôi biết rằng bất cứ loại đó là, loại mà thực hiện các typeclass Num
".
Mỗi lần xuất hiện của một chữ số nguyên trong nguồn Haskell được bao bọc với hàm ẩn fromInteger
. Vì vậy, (1 "one")
được chuyển đổi hoàn toàn thành ((fromInteger (1::Integer)) "one")
và subexpression (fromInteger (1::Integer))
có một loại chưa biết Num a => a
, một lần nữa có nghĩa là đó là một số loại không xác định, nhưng chúng tôi biết nó cung cấp một thể hiện của typeclass Num
.
Chúng tôi cũng có thể thấy rằng nó được áp dụng như một hàm số "one"
, vì vậy chúng tôi biết rằng loại của nó phải có dạng [Char] -> a0
trong đó a0
là một loại không xác định khác. Vì vậy, a
và [Char] -> a0
phải giống nhau. Thay thế trở lại loại Num a => a
mà chúng tôi đã tìm ra ở trên, chúng tôi biết rằng 1
phải có loại Num ([Char] -> a0) => [Char] -> a0)
và biểu thức (1 "one")
có loại Num ([Char] -> a0) => a0
. Đọc loại cuối cùng là "Có một số loại a0 là kết quả của việc áp dụng đối số [Char]
cho hàm và loại chức năng đó là một thể hiện của lớp Num
.
Vì vậy, biểu thức có một loại hợp lệ Num ([Char] -> a0) => a0
.
Haskell có tên gọi là Monomorphism restriction.Một khía cạnh của điều này là tất cả các biến kiểu trong biểu thức phải có một loại đã biết cụ thể trước khi bạn có thể đánh giá chúng. Tuy nhiên, GHC không biết bất kỳ loại a0
nó có thể cắm vào biểu thức loại ở trên có một ví dụ Num
được định nghĩa. t không có cách nào để đối phó với nó, và cung cấp cho bạn thông báo "No Instance for Num ...".
Hãy nhớ rằng không gian là toán tử ứng dụng hàm. – Bergi