gpt4 book ai didi

Haskell 设计 : Struggling with IO

转载 作者:行者123 更新时间:2023-12-03 22:16:08 25 4
gpt4 key购买 nike

我是一名新手 Haskell 程序员,我正在尝试编写一些 Haskell cgi,它将从 MySQL DB 读取并输出 JSON。我能够生成正确的 JSON,但无法正确获取数据类型以便能够正确输出 JSON。我也认为我主要还是在考虑必要性。这是我的代码。请注意,getTopBrands 提供 json 输出。

我的问题是我无法弄清楚如何从 getTopBrands 返回“[Char]”而不是“IO [Char]”。在我看来,我仍然认为势在必行。任何指针,解决此问题的建议将不胜感激。如果我需要提供其余代码,请告诉我。

RODB.hs:

{-# LANGUAGE RecordWildCards, OverloadedStrings, PackageImports #-}

module Main where

import RODB
import ROOutput
import System.Environment
import Database.HDBC
import Network.Socket(withSocketsDo)
import Network.CGI
import Text.XHtml
import qualified "bytestring" Data.ByteString.Lazy.Char8 as LBS
import Data.Aeson

page :: Html
page = body << h1 << str

main = runCGI $ handleErrors cgiMain

cgiMain :: CGI CGIResult
cgiMain =
do out <- getTopBrands 10 1
setHeader "Content-type" "application/json"
output $ renderHtml page out

getTopBrands :: Integer -> Integer -> IO [Char]
getTopBrands limit sorted =
do let temp = 0
dbh <- connect "127.0.0.1" "ReachOutPublicData" "root" "admin" "/tmp/mysql.sock"
if sorted == 1
then do brandlist <- getBrands dbh limit True
json <- convPublicBrandEntrytoJSON brandlist
return $ LBS.unpack json
else do brandlist <- getBrands dbh limit False
json <- convPublicBrandEntrytoJSON brandlist
return $ LBS.unpack json

最佳答案

Niklas B said , getTopBrandsIO是对的,因为它取决于 I/O。我想您的问题是当您尝试直接使用它时会收到类型错误,

cgiMain :: CGI CGIResult
cgiMain =
do out <- getTopBrands 10 1
setHeader "Content-type" "application/json"
output $ renderHtml page out

因为 do-block 中的所有语句必须属于同一个 monad,而该 block 的其余部分在 CGI 中.但是, CGI MonadIO ,因此您可以简单地 liftIO它进入 CGI ,
cgiMain :: CGI CGIResult
cgiMain =
do out <- liftIO $ getTopBrands 10 1
setHeader "Content-type" "application/json"
output $ renderHtml page out

Niklas 提出的下一点也是正确的,第二个 Integer getTopBrands 的论点应该是 Bool .但是,即使是当前的类型,也完全不需要重复代码,两个分支之间的区别只是 Bool getBrands 的参数, 所以
getTopBrands :: Integer -> Integer -> IO [Char]
getTopBrands limit sorted =
do let temp = 0
dbh <- connect "127.0.0.1" "ReachOutPublicData" "root" "admin" "/tmp/mysql.sock"
brandlist <- getBrands dbh limit (sorted == 1)
json <- convPublicBrandEntrytoJSON brandlist
return $ LBS.unpack json

只需将您分支的条件传递给它。

尼克拉斯的第三分

I also don't see why convPublicBrandEntrytoJSON would need to live in IO, but since you didn't provide its definition I cannot suggest an improvement here.



看起来也很有效,转换通常是纯函数。如果它在 IO 中的唯一原因是写作能力
json <- convPublicBrandEntrytoJSON brandlist

您应该知道您可以在 do-block 中绑定(bind)纯函数的结果
let json = convPublicBrandEntrytoJSON brandlist

使用 let .

关于Haskell 设计 : Struggling with IO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15932128/

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