Я новичок программист haskell, и я пытаюсь написать Haskell cgi, который будет читать из базы данных MySQL и выводить JSON. Я могу генерировать правильный JSON, но я не могу правильно получить типы данных, чтобы правильно выводить JSON. Я также думаю, что я в первую очередь думаю, что все еще необходимо. Вот мой код. Обратите внимание: getTopBrands предоставляет json-выход.Haskell design: Борьба с IO
Моя проблема в том, что я не могу понять, как вернуть «[Char]» из getTopBrands, а не «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
В чем проблема с 'IO' здесь? В конце концов, результат функции * зависит от результата операции ввода-вывода, поэтому я не буду рассматривать этот плохой стиль. Более очевидной проблемой здесь является параметр 'sorted', который имеет тип' Integer'. Если у него был тип 'Bool', вы могли бы передать его непосредственно на' getBrands' без уродливой ветви и дублирования кода. Я также не понимаю, почему 'convPublicBrandEntrytoJSON' должен будет жить в' IO', но поскольку вы не указали его определение, я не могу предложить улучшения здесь. –