2012-01-27 32 views
13

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 scottyredis, 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 keyshtml trong cùng một khối.

+1

Mọi người thường chỉ giải quyết cho liftIO trong khung web haskell? –

+1

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ể. –

+0

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ì? –

Trả lời

4

Vì một lý do nào đó, tôi cảm thấy như liftIO là xấu xí, nhưng nó thực sự không tệ. Đặc biệt nếu bạn làm điều này:

queryRedis :: Connection -> Redis a -> ActionM a 
queryRedis db r = liftIO $ runRedis db r 

Và định nghĩa một hàm áp dụng một phần redis = queryRedis db. Cảm ơn tất cả mọi người

Các vấn đề liên quan