Tôi có một câu hỏi về cách GHCi giả định loại của một số nguyên.Haskell: CóKhông có loại lớp. Tại sao lại là Integer?
Tôi đã đọc Có-Không có loại lớp nào Tìm hiểu bạn một Haskell.
Đây là liên kết nếu bạn muốn đọc toàn bộ nội dung. http://learnyouahaskell.com/making-our-own-types-and-typeclasses#a-yes-no-typeclass
Để đặt nhanh, chương này cho thấy rằng bằng cách xác định lớp của riêng tôi, tôi có thể tạo một hàm hoạt động với nhiều loại.
cuốn sách này định nghĩa lớp CóKhông với một chức năng
yesno :: a -> Bool
và làm Int
như một thể hiện của lớp CóKhông
instance YesNo Int where
yesno 0 = False
yesno _ = True
Khi tôi nạp này trên GHCi tôi và gõ
yesno 0
nó trả về lỗi. Tôi nghĩ có thể là do GHCi không thể biết liệu 0 có phải là Int
hoặc Integer
hoặc Double
hoặc loại khác trong lớp Num
. Trên thực tế khi tôi gõ yesno (0 :: Int) nó hoạt động.
Vì vậy chỉ để cho vui Tôi làm Integer
như một thể hiện của YesNo
lớp và viết
instance YesNo Integer where
yesno 0 = True
yesno _ = False
(Lưu ý rằng tôi lật True và False) và một lần nữa, tôi gõ
yesno 0
(mà không bất kỳ tuyên bố kiểu nào) thì GHCi đã cho thấy True
.
Hơn nữa, khi tôi gõ
yesno $ fromIntegral 0
nó trở True
, có nghĩa là GHCi nghĩ loại fromIntegral 0
là Integer
.
Vì vậy, điều này có nghĩa là khi tôi chỉ nhập một số nguyên trên GHCi, nó thường giả định giá trị của nó là Integer
thay vì? Tôi bối rối vì :t 0
trả về Num a => a