W jakich sytuacjach należy używać liftIO
? Kiedy używam funkcji ErrorT String IO
, funkcjasłuży do podnoszenia działań IO do ErrorT
, więc wydaje się zbędna.Haskell: lift vs liftIO
Odpowiedz
lift
zawsze podnosi się z warstwy "poprzedniej". Jeśli potrzebujesz podnieść z drugiej warstwy, potrzebujesz lift . lift
i tak dalej.
Z drugiej strony, liftIO
zawsze podnosi się z warstwy IO (która, jeśli jest obecna, znajduje się zawsze na dole stosu). Tak więc, jeśli masz więcej niż 2 warstwy monad, z pewnością docenisz liftIO
.
Porównaj typ argumentu w następujących lambdas.
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 to tylko skrót do IO Monady, w zależności od monady jesteś w zasadzie liftIO równa stosując zmienną liczbę wyciągów . Na początku może to zabrzmieć niepotrzebnie, ale użycie liftIO ma jedną wielką zaletę: sprawia, że twój kod IO jest niezależny od rzeczywistej konstrukcji Monada, dzięki czemu możesz ponownie użyć tego samego kodu bez względu na liczbę warstw, z których zbudowany jest ostatni Monad (jest to dość ważne podczas pisania monad transformatora).
Na wyciągnięcie ręki, liftIO nie przychodzi za darmo, podobnie jak winda: używane transformatory Monada muszą mieć na to wsparcie, np. Monada, w której się znajdujesz, musi być instancją klasy MonadIO, ale większość dzisiejszych Monad (i, oczywiście, sprawdzi to podczas kompilacji: to jest siła Haskella!).
- 1. Haskell: foldr vs foldr1
- 2. Haskell: Nakładające się przypadki
- 3. Haskell: dane algebraiczne vs krotka
- 4. Testowanie fragmentu w Lift
- 5. MVC na Lift/Scala
- 6. Haskell Lista Łączenie vs (głowa tail) format
- 7. Scala vs Haskell typeclasses "catchall" przypadki
- 8. Haskell vs. erlang: różnica w foldl?
- 9. foldr vs użytkowania foldr1 w Haskell
- 10. Memoizing IO Obliczenia Haskell
- 11. Haskell: ogólny IORef, MVar?
- 12. Rozproszone urywki Lift (Scala) (wiele elementów dziennie)
- 13. Porównanie modeli: Lift, Play i Furtka
- 14. Co oznacza -> _ => w Scala/Lift?
- 15. Dziedziczenie w Lift Mapper lub Record Framework
- 16. ORM dla Lift: Mapper lub JPA?
- 17. Czy jest możliwe kodowanie ogólnej funkcji "podnoszenia" w Haskell?
- 18. Jak mogę przerwać pętlę w Haskell?
- 19. Prośba o rodzaju danej Type w Scala vs Haskell
- 20. równe (=) Vs strzałka w lewo (<-) symbole w Haskell
- 21. Chmura Haskell zawsze wisi przy wysyłaniu wiadomości do ManagedProcess
- 22. Haskell ReaderT Env IO płyta montażowa
- 23. Jak napisać autobus na wydarzenie w Haskell?
- 24. Quirkiness w Haskell 7.8.3
- 25. Extensible Haskell Rodzaj Klasy
- 26. MonadState wystąpienie z Real World Haskell nie kompiluje
- 27. Kiedy używać programu Mapper lub Record in Lift?
- 28. Instalowanie Scala 2.9.1/Lift 2,4-M4 przy użyciu sbt 0.11.0
- 29. Scala lift framework, formularz ajax, który przesyła wiele wartości?
- 30. Lift-json wyodrębnia json z polem "type" do klasy case
Generalnie użyję 'liftIO' do podniesienia do warstwy IO, nawet jeśli' lift' jest wystarczający, ponieważ wtedy mogę zmienić stos monad i kod nadal działa. –
@John: dobry punkt. A także sprawia, że oczywiste jest, że podnosisz IO, a nie jakakolwiek inna monada. –