Mã này (lấy từ Learn You A Haskell):đánh giá Lazy và IO tác dụng phụ nhầm lẫn
main = do putStr "Hey, "
putStr "I'm "
putStrLn "Andy!"
rõ ràng desugars để
main = putStr "Hey, " >>=
(\_ -> putStr "I'm " >>=
(\_ -> putStrLn "Andy!"))
nào, như tôi hiểu nó có thể được interpretted nói "Để putStrLn "Andy!" Lần đầu tiên tôi cần phải đặt "Tôi", và để làm điều đó, trước tiên tôi cần phải đưa "Xin chào",
Tôi không đồng ý với cách giải thích này, điều này gây phiền toái vì t ông trình biên dịch rõ ràng là không và lá tôi cảm thấy bối rối. Vấn đề tôi có với nó là các lambdas bỏ qua lập luận của họ, trong quá trình đánh giá lười biếng không phải là loại điều này được cho là được công nhận và đoản mạch?
Ngoài ra, chắc chắn, ràng buộc trả về một hành động IO và khi hành động IO đó rơi vào chính nó sẽ được thực thi. Nhưng những gì để ngăn chặn nó từ in "Hey, Andy! Tôi"? Tôi nghi ngờ đó là bất cứ điều gì ràng buộc đang làm.
Ngoài ra, cách hoạt động IO của loại "IO()" mang đủ thông tin để cho phép hệ thống thời gian chạy in "Hey, tôi là Andy!"? Làm thế nào mà IO() khác với IO() so với bản in "Hello World!" hoặc ghi vào một tập tin?
xem xét khác, từ trang wikipedia cho đơn nguyên:
phiên bản có đường:
do
putStrLn "What is your name?"
name <- getLine
putStrLn ("Nice to meet you, " ++ name ++ "!")
khử đường phiên bản:
putStrLn "What is your name?" >>=
(\_ ->
getLine >>=
(\name ->
putStrLn ("Nice to meet you, " ++ name ++ "!")))
tương tự câu chuyện ở đây.
Tôi nghĩ rằng tôi chỉ cần xem định nghĩa liên kết cho IO và sau đó tất cả sẽ rõ ràng. Một cái gì đó khác mà sẽ giúp rất nhiều là nếu ai đó có thể giúp tôi bước qua cách chương trình thực sự được đánh giá và xác định những khoảnh khắc chính xác khi các tác dụng phụ xảy ra.
"Các lambdas bỏ qua đối số của họ, trong quá trình đánh giá lười biếng không phải là loại điều này được cho là được công nhận và đoản mạch?" Bạn đặt cược! Đối số thứ hai cho '(>> =)' là một hàm đặc biệt lười ở đây, nhưng hàm '(>> =)' không phải là lười. –