GET Route ActionCtxT中的Haskell Spock IO错误

GET Route ActionCtxT中的Haskell Spock IO错误,haskell,uuid,haskell-spock,Haskell,Uuid,Haskell Spock,我尝试在web应用程序(Webserver)的路由定义中返回uuid 路由的定义非常简单 get("PATH") $ do text "Hello World" 现在,我尝试通过nextRandom从模块返回uuid。 该函数返回一个IO(可能是UUID)值 所以我想,既然我在IO中并且与另一个IO一起工作,我就必须用 所以我想,既然我在木卫一和另一个木卫一一起工作 这就是问题所在,当你在斯波克布线时,你不在IO。错误消息告诉您实际处于什么上下文中:ActionCtxT ctx0 m0。根据

我尝试在web应用程序(Webserver)的路由定义中返回uuid

路由的定义非常简单

get("PATH") $ do
 text "Hello World"
现在,我尝试通过
nextRandom
从模块返回uuid。 该函数返回一个
IO(可能是UUID)

所以我想,既然我在IO中并且与另一个IO一起工作,我就必须用

所以我想,既然我在木卫一和另一个木卫一一起工作

这就是问题所在,当你在斯波克布线时,你不在IO。错误消息告诉您实际处于什么上下文中:
ActionCtxT ctx0 m0
。根据,这是一个捆绑效应和状态的模型

您可以使用
liftIO
将IO计算“提升”到正确的类型

get ("id") $ do
    uuid <- liftIO nextUUID
    json . pack $ show $ uuid
get(“id”)$do
uuid
所以我想,既然我在木卫一和另一个木卫一一起工作

这就是问题所在,当你在斯波克布线时,你不在IO。错误消息告诉您实际处于什么上下文中:
ActionCtxT ctx0 m0
。根据,这是一个捆绑效应和状态的模型

您可以使用
liftIO
将IO计算“提升”到正确的类型

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

uuid基于Libby的有用回答,我刚刚添加了
Nothing
捕获,可能是uuid
。以下是完整的程序:

{-# 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
{-#语言重载字符串}
模块主要在哪里
导入Web.Spock隐藏(头)
导入Web.Spock.Config
导入Data.UUID.V1
导入数据池
导入控制.Monad.IO.Class
导入Database.PostgreSQL.Simple
导入数据.Aeson(值(Null))
将合格的Network.HTTP.Types.Status导入为HTTP
键入AppAction a=SpockActionCtx()连接AppSession AppState a
数据AppState=EmptyState
数据应用会话=清空会话
main::IO()
主要=

dopool基于Libby的有用答案,我刚刚添加了
Nothing
的捕获,可能是UUID
。以下是完整的程序:

{-# 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
{-#语言重载字符串}
模块主要在哪里
导入Web.Spock隐藏(头)
导入Web.Spock.Config
导入Data.UUID.V1
导入数据池
导入控制.Monad.IO.Class
导入Database.PostgreSQL.Simple
导入数据.Aeson(值(Null))
将合格的Network.HTTP.Types.Status导入为HTTP
键入AppAction a=SpockActionCtx()连接AppSession AppState a
数据AppState=EmptyState
数据应用会话=清空会话
main::IO()
主要=

就这样做了。还有一些新的东西需要我去学习。liftIO,Monad变压器组?好吧,好吧,我最终会到达那里的。现在节目返回的
只是03fcbcbe-fbf0-11e6-8001-a8667f260e4c
,因为我想uuid是一个[可能是uuid]。我想我会找出如何从中获得实际值,并在这里发布完全正确的结果。万分感谢。成功了。还有一些新的东西需要我学习。liftIO,Monad变压器组?好吧,好吧,我最终会到达那里的。现在节目返回的
只是03fcbcbe-fbf0-11e6-8001-a8667f260e4c
,因为我想uuid是一个[可能是uuid]。我想我会找出如何从中获得实际值,并在这里发布完全正确的结果。非常感谢。