gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:19:58 24 4
gpt4 key购买 nike

我有以下函数可以生成 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 将其公开给网络,例如:
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 -block 产生 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 请求处理程序中的驱动随机字符串函数?

最佳答案

ActionT type 是 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

关于haskell - 如何在 Spock 请求处理程序中使用 `IO String`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35381853/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com