Tôi đang cố gắng trải qua ví dụ YesNo
từ Learn You a Haskell for Great Good!
cuốn sách.Biến kiểu mơ hồ `a0 'trong các ràng buộc
Đây là mã nguồn của tôi:
module Main where
main :: IO()
main = putStrLn (show (yesno 12))
class YesNo a where
yesno :: a -> Bool
instance YesNo Bool where
yesno b = b
instance YesNo [a] where
yesno [] = False
yesno _ = True
instance YesNo Int where
yesno 0 = False
yesno _ = True
Khi tôi thực thi mã này ngoại lệ sau đây xảy ra:
Ambiguous type variable `a0' in the constraints:
(YesNo a0) arising from a use of `yesno'
at /Users/mkhadikov/Projects/personal/haskell/hello-world/yesno.hs:5:25-29
(Num a0) arising from the literal `12'
at /Users/mkhadikov/Projects/personal/haskell/hello-world/yesno.hs:5:31-32
Probable fix: add a type signature that fixes these type variable(s)
In the first argument of `show', namely `(yesno 12)'
In the first argument of `putStrLn', namely `(show (yesno 12))'
In the expression: putStrLn (show (yesno 12))
bạn có thể vui lòng giải thích những gì xảy ra với mã này?
Có thể tạo ra loại của riêng bạn của nhà xây dựng dữ liệu mà làm việc như '12' trong Haskell? Dường như bất cứ khi nào bạn tạo một hàm tạo dữ liệu, nó xây dựng một giá trị của một kiểu duy nhất. Nhưng khi bạn viết '12', bạn có thể thấy nó không phải là giá trị của một kiểu đơn lẻ, mà là một giá trị của bất kỳ kiểu nào mà kiểu đó bị ràng buộc bởi Num. Do đó 'Num a => a'. Tôi có giải thích điều này một cách chính xác không? Loại hình này có giống như xây dựng một giá trị có tồn tại/công đoàn không? – CMCDragonkai
@CMCDragonkai Tôi hơi mờ về chi tiết nhưng về cơ bản chữ "Num' chứa một hàm' fromInteger :: Num a => Integer -> a'. Một chữ số làm việc như thể 'fromInteger' được gọi trên đó. – fuz
Ah, do đó, 'a' không trở thành một công đoàn tồn tại. Rất thú vị. – CMCDragonkai