Tôi bắt đầu nghiên cứu Haskell một tuần trước và có một vấn đề lạ. Tôi đã tạo một kiểu dữ liệu đơn giản và muốn hiển thị nó trong một bảng điều khiển. Tôi đã tạo 2 hàm cho 2 hàm tạo của kiểu của tôi. Trình biên dịch có thể gọi hàm nếu tôi sử dụng một hàm tạo với 2 đối số. Nhưng nó không thể gọi một chức năng khác mà nên bắt một nhà xây dựng với 1 đối số.Chức năng cho các nhà xây dựng dữ liệu khác nhau
module Main (
main
) where
data MyContainter a b = FirstVersion a b
| SecondVersion a
deriving(Show,Eq)
showContainer (FirstVersion a b) = show b
showContainer (SecondVersion a) = show a
--startF = showContainer (FirstVersion 1 2) -- it works
startF = showContainer (SecondVersion 1) -- it doesn't work
main = putStr startF
Các trình biên dịch nói:
Ambiguous type variable `a0' in the constraint:
(Show a0) arising from a use of `showMaybe'
Probable fix: add a type signature that fixes these type variable(s)
In the expression: showMaybe (SecondVersion 1)
In an equation for `startF': startF = showMaybe (SecondVersion 1)
Tại sao nó lại nói vậy? Tôi tạo ra (SecondVersion 1) trực tiếp và không hiểu tại sao trình biên dịch không gọi showContainer (SecondVersion a).
Nó giúp nhận ra rằng biến kiểu 'a0' trong thông báo lỗi giống như' b', và không liên quan gì đến 'a'. (Trình biên dịch vừa xảy ra để chọn tên đó vì lớp 'Show' sử dụng tên' a'). – hammar