Tôi cần phải sử dụng biến danh sách đơn nguyên. Tôi đã đọc rằng có các sự cố có thể xảy ra với ListT IO
từ Control.Monad.List
, vì IO
không giao hoán, vì vậy, tôi đang xem ListT done right. Nhưng tôi nhận được một số hành vi bất ngờ.danh sách biến áp đơn nguyên
xem xét kiểm tra đơn giản này:
test = runListT $ do
x <- liftList [1..3]
liftIO $ print x
y <- liftList [6..8]
liftIO $ print (x,y)
Sử dụng Control.Monad.List:
Main> test
1
(1,6)
(1,7)
(1,8)
2
(2,6)
(2,7)
(2,8)
3
(3,6)
(3,7)
(3,8)
[(),(),(),(),(),(),(),(),()]
Sử dụng "ListT thực hiện ngay":
Main> test
1
(1,6)
Đây có phải là một vấn đề với " ListT thực hiện đúng ", hoặc tôi chỉ sử dụng nó sai? Có lựa chọn thay thế nào khác không?
Cảm ơn!
Hmm, ok điều này có ý nghĩa và ý tưởng 'runAll_' của bạn khá hay! Tôi đã mong đợi hành vi tương tự như lồng nhau cho các vòng với các câu lệnh in trong một ngôn ngữ bắt buộc. Nhưng nếu "ListT thực hiện đúng" là lười biếng, tại sao nó vẫn thực hiện tác dụng phụ cho người đứng đầu danh sách? –
Giả sử bạn luôn muốn ít nhất là phần tử đầu tiên, vì vậy nó kết thúc tốt đẹp "toàn bộ danh sách" trong 'm', và cũng bao bọc cdr trong' m'; chiếc xe không được bọc. Nếu bạn sắp xếp chuỗi "toàn bộ danh sách", nó sẽ chỉ hiển thị ô tô. – Owen