Tôi mới dùng Haskell và phải đối mặt với lỗi "không thể xây dựng loại vô hạn" mà tôi không thể hiểu được. Trong thực tế, ngoài ra, tôi đã không thể tìm thấy một lời giải thích tốt về những gì lỗi này thậm chí có nghĩa là, vì vậy nếu bạn có thể vượt ra ngoài câu hỏi cơ bản của tôi và giải thích lỗi "loại vô hạn", tôi thực sự đánh giá cao nó.Tại sao mã Haskell này tạo ra lỗi "loại vô hạn"?
Dưới đây là các mã:
intersperse :: a -> [[a]] -> [a]
-- intersperse '*' ["foo","bar","baz","quux"]
-- should produce the following:
-- "foo*bar*baz*quux"
-- intersperse -99 [ [1,2,3],[4,5,6],[7,8,9]]
-- should produce the following:
-- [1,2,3,-99,4,5,6,-99,7,8,9]
intersperse _ [] = []
intersperse _ [x] = x
intersperse s (x:y:xs) = x:s:y:intersperse s xs
Và đây là lỗi khi cố gắng tải nó vào người phiên dịch:
Prelude> :load ./chapter.3.ending.real.world.haskell.exercises.hs
[1 of 1] Compiling Main (chapter.3.ending.real.world.haskell.exercises.hs, interpreted)
chapter.3.ending.real.world.haskell.exercises.hs:147:0:
Occurs check: cannot construct the infinite type: a = [a]
When generalising the type(s) for `intersperse'
Failed, modules loaded: none.
Cảm ơn.
-
Dưới đây là một số điều chỉnh mã và một hướng dẫn chung để đối phó với các lỗi "loại vô hạn" trong Haskell:
Corrected đang
intersperse _ [] = []
intersperse _ [x] = x
intersperse s (x:xs) = x ++ s:intersperse s xs
gì vấn đề là:
Trạng thái chữ ký loại của tôi s mà tham số thứ hai để phân tách là danh sách các danh sách . Do đó, khi mẫu của tôi khớp với "s (x: y: xs)", x và y đã trở thành danh sách. Tuy nhiên, tôi đã xử lý x và y là yếu tố, không phải danh sách.
Hướng dẫn để đối phó với các "loại vô hạn" lỗi:
Hầu hết thời gian, khi bạn nhận được lỗi này, bạn đã quên các loại của các biến khác nhau mà bạn đang làm việc với, và bạn đã cố gắng sử dụng một biến như thể nó là một số loại khác hơn so với những gì nó được. Hãy xem xét kỹ mọi thứ về loại nào so với cách bạn sử dụng nó và điều này thường sẽ phát hiện ra vấn đề.
Một mẹo hay khác: khai báo các loại một cách rõ ràng. Điều này mang lại cho trình biên dịch một cái gì đó để kiểm tra. –
Vì vậy, điều này giải quyết vấn đề, nhưng tại sao trình biên dịch nói "Không thể xây dựng kiểu vô hạn?". Điều đó nghĩa là gì? Nếu vấn đề là bạn đang cố gắng thực hiện các thao tác trên các kiểu không hỗ trợ các hoạt động đó, tại sao trình biên dịch lại không nói như vậy? – freedrull
+1 cho cấu trúc của câu hỏi (câu hỏi - đã sửa - vấn đề là - hướng dẫn) – Dacav