Tôi đang học máy biến áp đơn nguyên và tôi bối rối khi sử dụng thang máy là cần thiết. Giả sử rằng tôi có các mã sau đây (Nó không làm bất cứ điều gì thú vị, chỉ đơn giản nhất tôi có thể đi kèm với để trình diễn).Khi chính xác là cần thiết trong máy biến áp monad?
foo :: Int -> State Int Int
foo x = do
(`runContT` pure) $ do
callCC $ \exit -> do
when (odd x) $ do
-- lift unnecessary
a <- get
put $ 2*a
when (x >= 5) $ do
-- lift unnecessary, but there is exit
a <- get
exit a
when (x < 0) $ do
-- lift necessary
a <- lift $ foo (x + 10)
lift $ put a
lift get
Vì vậy, có một ngăn xếp đơn nguyên, nơi khối chính có loại ContT Int (StateT Int Identity) Int
.
Bây giờ, trong phần thứ ba when
làm chặn với đệ quy cần phải có thang máy để chương trình biên dịch. Trong khối thứ hai, không có thang máy cần thiết, nhưng tôi bằng cách nào đó giả định đó là vì sự hiện diện của exit
mà bằng cách nào đó buộc dòng trên được nâng lên ContT
. Nhưng trong khối đầu tiên, không cần có thang máy. (Nhưng nếu nó được thêm vào một cách rõ ràng thì cũng chẳng có vấn đề gì cả.) Điều này thực sự gây nhầm lẫn cho tôi. Tôi cảm thấy tất cả các khối when
làm tương đương và cả thang máy nên được yêu cầu ở khắp mọi nơi hoặc không nơi nào. Nhưng điều đó dường như không đúng. Đâu là sự khác biệt chính khiến thang máy yêu cầu/không cần thiết?