当前位置:  开发笔记 > 编程语言 > 正文

如何在Spock请求处理程序中使用`IO String`?

如何解决《如何在Spock请求处理程序中使用`IOString`?》经验,为你挑选了1个好方法。

我有以下函数生成1024的倍数的随机字符串:

import System.Random

rchars :: Int -> [IO Char]
rchars n = map (\_ -> randomRIO ('a', 'z')) [n | n <- [0..n]] -- a wasteful "iteration"-like func

rstr :: Int -> IO String
rstr n = sequence $ rchars (1024 * n)

我想使用Spock将其暴露给Web,例如:

import Data.Monoid
import Data.Text
import Lib
import Web.Spock.Safe

main :: IO ()
main =
    runSpock 8080 $ spockT id $
    do get root $
           redirect "/data/1"
       get ("data"  var) $ \n ->
          do
           str <- rstr n
           text ("boo:" <> str <> "!")

但这是不正确的,因为最里面的do块产生一个IO b0,而不是Spock的预期类型:

Couldn't match type ‘ActionT IO ()’ with ‘IO b0’
Expected type: Int -> IO b0
  Actual type: hvect-0.2.0.0:Data.HVect.HVectElim
                 '[Int] (ActionT IO ())
The lambda expression ‘\ n -> ...’ has one argument,
but its type ‘hvect-0.2.0.0:Data.HVect.HVectElim
                '[Int] (ActionT IO ())’
has none
In the second argument of ‘($)’, namely
  ‘\ n
     -> do { str <- rstr n;
             text ("boo:" <> str <> "!") }’
In a stmt of a 'do' block:
  get ("data"  var)
  $ \ n
      -> do { str <- rstr n;
              text ("boo:" <> str <> "!") }

如何IO在Spock get请求处理程序中使用我的-driven随机字符串函数?



1> arrowd..:

ActionT类型是的一个实例MonadIO类型类.这意味着您可以使用liftIO在此monad中执行IO操作.在你的情况下,你似乎需要liftIO $ rstr n而不是简单rstr n.

这表明我所指的:

import Control.Monad.IO.Class
...
main :: IO ()
main =
    runSpock 8080 $ spockT id $
    do get root $
           redirect "/data/1"
       get ("data"  var) $ \n ->
          do
           str <- liftIO $ rstr n
           text $ pack str

推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有