2017-02-25 17 views
0

我嘗試返回web應用程序的路由定義中的uuid(Spock Webserver)。Haskell在GET路由中的Spock IO ActionCtxT錯誤

航線是非常簡單的定義

get("PATH") $ do 
text "Hello World" 

現在我嘗試通過nextRandomData.UUID.V1模塊返回UUID。 該函數返回一個IO(Maybe UUID)值。

所以我想,既然我在IO,並與另一IO工作,我必須做的值綁定簡單地用<-,就像這樣:

get ("id") $ do 
    uuid<-nextUUID 
    json . pack $ show $ uuid 

但是,編譯說沒有:

Couldn't match type ‘ActionCtxT ctx0 m0’ with ‘IO’ 
     Expected type: IO b0 
     Actual type: ActionCtxT ctx0 m0 b0 
    • In a stmt of a 'do' block: json . pack $ show $ uuid 
     In the second argument of ‘($)’, namely 
     ‘do { uuid <- nextUUID; 
       json . pack $ show $ uuid }’ 

爲什麼拋出這個錯誤? 我可以通過一個簡單的打印示例輕鬆創建uuid,但在Spock中,我不明白ActionCtxT的功能以及爲什麼我無法在其中執行uuid IO。

回答

2

所以我想,既然我在IO與另一個IO

那這裏的麻煩,當你在斯波克正在路由工作,你是不是在IO。錯誤消息告訴你你真的在什麼情況下:ActionCtxT ctx0 m0。根據the docs,這是一個monad transformer stack捆綁效果和狀態。

您可以使用liftIO將IO計算「提升」爲正確的類型。

get ("id") $ do 
    uuid <- liftIO nextUUID 
    json . pack $ show $ uuid 
+0

這樣做了,而且有些新東西讓我學習。 liftIO,Monad變壓器堆疊?那麼,我最終會到達那裏。 現在該節目正在返回'Just 03fcbcbe-fbf0-11e6-8001-a8667f260e4c',因爲uuid是我猜想的[也許UUID]。我想我會弄清楚如何從中獲得真正的價值,並在此發佈完整的正確結果。太感謝了。 –

0

基於Libbys有用的答案我只是增加漁獲的Maybe UUIDNothing。在這裏完整的程序:

{-# LANGUAGE OverloadedStrings #-} 


module Main where 

import Web.Spock hiding (head) 
import Web.Spock.Config 

import Data.UUID.V1 
import Data.Pool 
import Control.Monad.IO.Class 
import Database.PostgreSQL.Simple 
import Data.Aeson (Value(Null)) 

import qualified Network.HTTP.Types.Status as Http 

type AppAction a = SpockActionCtx() Connection AppSession AppState a 
data AppState = EmptyState 
data AppSession = EmptySession 


main :: IO() 
main = 
    do pool<-createPool (connect (ConnectInfo "localhost" 5432 "" "" "envelopes")) close 1 10 10 
    spockCfg <- defaultSpockCfg EmptySession (PCPool pool) EmptyState 
    runSpock 8080 (spock spockCfg app) 

app :: SpockM Connection AppSession AppState() 
app = do 
    get ("json/id") $ do 
     uuid<-liftIO nextUUID 
     case uuid of 
     Nothing -> do 
      setStatus Http.status500 
      json Null 
     Just x -> json $ show x 
相關問題