Tôi đang chơi xung quanh bằng cách viết một ứng dụng web. Trong trường hợp này, tôi đang sử dụng scotty và redis, nhưng sự cố này xuất hiện trong bất kỳ kết hợp web/db nào. Tôi đã sử dụng hạnh phúc trước đó, vì vậy tôi cũng thích một ví dụ ở đó.Kết hợp hai monads khi không có biến áp?
Scotty có bạn xác định các tuyến đường trong một đơn nguyên lồng nhau, mà làm cho nó dễ dàng để truy cập kết nối cơ sở dữ liệu trong vòng một lộ trình:
main = do
db <- connect defaultConnectInfo
scotty 3000 $ do
get "/keys" $ do
keys <- liftIO $ runRedis db $ keys "*"
html $ T.pack $ show keys
Các làm chặn trong get có kiểu: Web.Scotty.ActionM()
. Tất cả các lệnh redis có loại Database.Redis.Redis a
. Không redis hoặc scotty có một biến áp monad.
Cách tốt nhất để kết hợp những thứ này là gì? Tôi mới quen với haskell, nhưng tôi đã cố gắng để có được ReaderT làm việc với các trang web monad trong happstack.
Lý tưởng nhất, tôi bằng cách nào đó có thể tạo một chồng đơn nguyên mới hỗ trợ cả hai keys
và html
trong cùng một khối.
Mọi người thường chỉ giải quyết cho liftIO trong khung web haskell? –
Tôi không biết câu trả lời ở đây, nhưng tôi thấy vấn đề của bạn cũng tương tự như biến thế đơn nguyên. Về cơ bản, bạn muốn thực hiện một kiểu, hãy gọi nó là 'IdentityTT m 'ma', sao cho' IdentityTT m'' hoạt động giống như ['IdentityT'] (http://hackage.haskell.org/packages/archive/transformers /0.2.1.0/doc/html/Control-Monad-Trans-Identity.html). Câu hỏi đầu tiên được trả lời, tất nhiên, là nếu điều đó thậm chí có thể. –
Một cách khác để cụm từ câu hỏi là: Bạn có sử dụng liftIO để truy vấn cơ sở dữ liệu trong tất cả các khung công tác haskell không? Mô hình phổ biến nhất khi cơ sở dữ liệu không được đưa vào khung làm việc là gì? –