首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Haskell scotty和持久性rest API

Haskell scotty和持久性rest API
EN

Stack Overflow用户
提问于 2018-06-28 03:20:28
回答 1查看 200关注 0票数 1

我是新来Haskell的。我喜欢创建简单的crud rest api,并使用scotty和persistence。我使用sqlite和一个表todo (title text, description text),我在表中有一些记录。我的观点是以json格式显示enpoint /todos上的所有记录。当我打印它时,我得到一个错误

代码语言:javascript
复制
  • Couldn't match expected type ‘Data.Text.Internal.Lazy.Text’
                  with actual type ‘[Entity ToDo]’
    • In the first argument of ‘text’, namely ‘(_ToDo)’
      In a stmt of a 'do' block: text (_ToDo)
      In the second argument of ‘($)’, namely
        ‘do _ToDo <- liftIO readToDo
            text (_ToDo)’
   |
69 |     text(_ToDo)
   |          ^^^^^

我的代码:

代码语言:javascript
复制
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE EmptyDataDecls       #-}
{-# LANGUAGE FlexibleContexts     #-}
{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE GADTs                #-}
{-# LANGUAGE OverloadedStrings    #-}
{-# LANGUAGE QuasiQuotes          #-}
{-# LANGUAGE TemplateHaskell      #-}
{-# LANGUAGE TypeFamilies         #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE MultiParamTypeClasses #-}
module Main where
import Data.Monoid ((<>))
import Web.Scotty
import qualified Web.Scotty as S
import Database.Persist
import Database.Persist.Sqlite
import Database.Persist.TH 
import Data.Text (Text)
import Data.Time (UTCTime, getCurrentTime)
import qualified Data.Text as T
import Control.Monad.IO.Class (liftIO)
import Control.Monad.Trans.Resource (runResourceT, ResourceT)
import Database.Persist.Sql
import Control.Monad (forM_)
import Control.Applicative
import Control.Monad.Logger
import Data.Aeson 
import Data.Default.Class
import GHC.Generics
import Control.Monad.IO.Class (liftIO)

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
ToDo
  title String
  description String
  deriving Show
|]


runDb :: SqlPersist (ResourceT (NoLoggingT IO)) a -> IO a
runDb = runNoLoggingT
    . runResourceT
    . withSqliteConn "todo.db"
    . runSqlConn


instance ToJSON ToDo where
  toJSON(ToDo title description) = object ["title" .= title, "description" .= description]



readToDo :: IO [Entity ToDo]
readToDo = (runDb $ selectList [] [LimitTo 10] )

routes :: ScottyM()
routes = do
  S.get "/hello" $ do
    text "hello world!"
  S.get "/hello/:name" $ do
    name <- param "name"
    text ("hello" <> name <> "!")
  S.get "/todos" $ do
    _ToDo <- liftIO readToDo
    text(_ToDo)

main = do
  putStrLn "Starting server...."
  scotty 7777 routes

如何纠正这一点?

EN

回答 1

Stack Overflow用户

发布于 2018-06-28 05:15:24

看起来像是编译器指责你在实体ToDo-s列表和Data.Text.Lazy之间有一个糟糕的转换。

请尝试使用pack函数手动转换:

代码语言:javascript
复制
import Data.Text.Lazy (pack)
...
routes = do
  S.get "/hello" $ do
    text "hello world!"
  S.get "/hello/:name" $ do
    name <- param "name"
    text ("hello" <> name <> "!")
  S.get "/todos" $ do
    _ToDo <- liftIO readToDo
    text(pack . show $ _ToDo)   -- explicit conversion
...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51070009

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档