Trong trường hợp nào nên sử dụng liftIO
? Khi tôi đang sử dụng ErrorT String IO
, chức năng lift
hoạt động để nâng các tác vụ IO vào ErrorT
, vì vậy liftIO
có vẻ không cần thiết.Haskell: lift vs liftIO
Trả lời
lift
luôn nâng lên từ lớp "trước đó". Nếu bạn cần phải nâng từ lớp thứ hai, bạn sẽ cần lift . lift
và cứ thế.
Mặt khác, liftIO
luôn luôn nâng từ lớp IO (trong đó, khi có mặt, luôn ở dưới cùng của ngăn xếp). Vì vậy, nếu bạn có nhiều hơn 2 lớp monads, bạn sẽ đánh giá cao liftIO
.
Hãy so sánh các loại lập luận trong lambdas sau:.
type T = ReaderT Int (WriterT String IO) Bool
> :t \x -> (lift x :: T)
\x -> (lift x :: T) :: WriterT String IO Bool -> T
> :t \x -> (liftIO x :: T)
\x -> (liftIO x :: T) :: IO Bool -> T
liftIO chỉ là một phím tắt để IO đơn nguyên, tùy theo các đơn nguyên bạn đang ở trong Về cơ bản, liftIO bằng việc sử dụng một số biến của thang máy . Lúc đầu điều này nghe có vẻ dư thừa nhưng việc sử dụng liftIO có một lợi thế lớn: nó làm cho mã IO của bạn trở nên độc lập với cấu trúc Monad thực tế để bạn có thể tái sử dụng cùng một mã bất kể số lượng lớp Monad cuối cùng của bạn đã được xây dựng (điều này khá quan trọng khi viết một biến áp đơn nguyên).
Trên bàn tay ồ ạt, liftIO không đến miễn phí, như thang máy: máy biến áp Monad bạn đang sử dụng phải có hỗ trợ cho nó, ví dụ: Monad bạn đang ở phải là một thể hiện của lớp MonadIO, nhưng hầu hết Monads ngày nay làm (và tất nhiên, trình kiểm tra kiểu sẽ kiểm tra điều này cho bạn tại thời gian biên dịch: đó là sức mạnh của Haskell!).
- 1. Haskell: foldr vs foldr1
- 2. Haskell: Danh sách vs Luồng
- 3. Guards vs if-then-else vs trường hợp trong Haskell
- 4. Haskell - lớp vs typeclass - sự khác biệt
- 5. Haskell: Dữ liệu đại số vs tuple
- 6. foldr vs sử dụng foldr1 trong Haskell
- 7. Haskell Danh sách Concatenation vs (đầu: đuôi) định dạng
- 8. Haskell: IORef chung, MVar?
- 9. Lift giá trị lỗi để ErrorT đơn nguyên biến
- 10. Trạng thái quản lý Lift của Scala như thế nào?
- 11. Cài đặt Scala 2.9.1/Lift 2.4-M4 bằng sbt 0.11.0
- 12. Lift theo dõi một người dùng đăng nhập
- 13. Điều gì -> _ => có nghĩa là trong Scala/Lift?
- 14. Reverse AJAX (Comet) và Spring MVC so với Scala/LIFT?
- 15. Memoizing IO tính toán trong Haskell
- 16. Haskell ReaderT Env IO boilerplate
- 17. Làm cách nào để thoát khỏi vòng lặp trong Haskell?
- 18. Extensible Haskell Loại Lớp
- 19. Haskell: Bị mắc kẹt trong IO monad
- 20. Haskell Parser combinators
- 21. Làm thế nào để bắt ngoại lệ và chuyển hướng đến trang lỗi trong Lift?
- 22. Scala/Lift Framework chạy chỉ trên máy chủ web cầu cảng?
- 23. Xác định TH trường Lift với nhiều loại dữ liệu đại số
- 24. Không thể phân tích một json để một lớp `ProvinceJson`, với lift-json
- 25. Haskell Interactive
- 26. Haskell FlatMap
- 27. Haskell ncurses
- 28. Haskell Debugging
- 29. J2ME VS Android VS iPhone VS Symbian VS Windows CE
- 30. Exec vs ExecWait vs ExecShell vs nsExec :: Exec vs nsExec :: ExecToLog vs nsExec :: ExecToStack vs ExecDos vs ExeCmd
Tôi thường sẽ sử dụng 'liftIO' để nâng lên lớp IO ngay cả khi' lift' là đủ, vì sau đó tôi có thể thay đổi ngăn xếp đơn và mã vẫn hoạt động. –
@ John: điểm tốt. Và nó cũng làm cho nó rõ ràng rằng bạn đang nâng IO và không phải bất kỳ đơn nguyên khác. –