tôi có chức năng như sau:chức năng không thể phù hợp với loại
foo :: Int -> a -> [a]
foo n v = bar n
where
bar :: Int -> [a]
bar n = take n $ repeat v
sử dụng báo cáo ghci lỗi này:
Couldn't match type `a' with `a1'
`a' is a rigid type variable bound by
the type signature for foo :: Int -> a -> [a] at hs99.hs:872:1
`a1' is a rigid type variable bound by
the type signature for bar :: Int -> [a1] at hs99.hs:875:9
Expected type: [a1]
Actual type: [a]
In the expression: take n $ repeat v
In an equation for `bar': bar n = take n $ repeat v
Nếu loại bỏ các khai báo kiểu của thanh, mã có thể được biên dịch mà không có lỗi. Vì vậy, loại khai báo thích hợp của thanh ở đây là gì? Và tại sao lỗi xảy ra, bởi vì kiểu khai báo của thanh là chung chung hơn định nghĩa của thanh (mà là ràng buộc với một số loại trong foo)?
Cảm ơn bạn đã trợ giúp!
Nhờ sự giúp đỡ! Như tôi đã nói, nếu loại bỏ khai báo kiểu 'bar', ghci có thể biên dịch mã, điều đó có nghĩa là ghci ngầm sử dụng ScopedTypeVariable ở đây cho nó? – Orup
được rõ ràng hơn, phạm vi loại biến và loại bỏ 'thanh' loại tuyên bố cả hai có thể làm cho mã biên dịch. chỉ cần tự hỏi nếu họ đang làm cùng một thủ thuật. – Orup
Không, họ nhận được cùng một mã được biên dịch, nhưng họ nhận được một cách khác nhau. Xem chỉnh sửa của tôi. – dave4420