Tôi mới sử dụng Haskell và tôi cố gắng hiểu cách thực hiện IO chính xác.Haskell IO: Không thể khớp với loại mong đợi `IO a0 'với loại thực tế
Các công trình sau ok:
main = do
action <- cmdParser
putStrLn "Username to add to the password manager:"
username <- getLine
case action of
Add -> persist entry
where
entry = Entry username "somepassword"
Trong khi kết quả như sau do lỗi biên dịch:
main = do
action <- cmdParser
case action of
Add -> persist entry
where
entry = Entry promptUsername "somepassword"
promptUsername = do
putStrLn "Username to add to the password manager:"
username <- getLine
Lỗi là ở đây:
Couldn't match expected type `IO b0' with actual type `[Char]'
Expected type: IO b0
Actual type: String
In the expression: username
[...]
gì đang xảy ra ở đây? Tại sao phiên bản đầu tiên hoạt động, trong khi phiên bản thứ hai thì không?
Tôi biết rằng trong Stack Overflow có một số câu hỏi tương tự như thế này, nhưng không ai trong số họ dường như giải thích vấn đề này với tôi.
Tôi sẽ mở rộng. Đây là ký hiệu gây nhầm lẫn. Mã như 'do {a; b <- c; d b}' thực sự là viết tắt của 'a >> = \ _ -> c >> = \ b -> d b'. Những người đến từ thế giới bắt buộc nghĩ về '<-' ở đây như một nhà điều hành phân công. Không phải vậy. Mỗi dòng trong ký hiệu được dịch thành hàm ẩn danh và đối số dấu '<-' của hàm đó. Người ta nên được khuyến khích mạnh mẽ để đọc về monads và ứng dụng thực tế của họ để làm quen với họ. – permeakra
Tôi thực sự có thể hiểu được vấn đề và giải pháp mà không có kiến thức về monads. –