Haskell 与莎士比亚一起使用仆人(哈姆雷特、朱利叶斯、卢修斯)
如何将莎士比亚(来自yesod)用于服务Web服务API 我尝试:Haskell 与莎士比亚一起使用仆人(哈姆雷特、朱利叶斯、卢修斯),haskell,yesod,servant,Haskell,Yesod,Servant,如何将莎士比亚(来自yesod)用于服务Web服务API 我尝试: type TestAPI = "tests" :> Get '[JSON] [Test] :<|> "Test.html" :> Get '[HTML] Html serverTestAPI :: ServerT TestAPI AppM serverTestAPI = tests :<|> test :<|> te
type TestAPI
= "tests" :> Get '[JSON] [Test]
:<|> "Test.html" :> Get '[HTML] Html
serverTestAPI :: ServerT TestAPI AppM
serverTestAPI = tests
:<|> test
:<|> testHtml
tests :: AppM [Test]
tests = do return [ Test 1 "Test 1"
, Test 2 "Test 2"
]
testHtml = [hamlet|
$doctype 5
.........
|]
类型TestAPI
=“测试”:>获取“[JSON][Test]
:“Test.html”:>获取“[html]html
serverTestAPI::ServerT TestAPI应用程序
serverTestAPI=测试
:测试
:testHtml
测试::AppM[测试]
测试=执行返回[测试1“测试1”
,测试2“测试2”
]
testHtml=[hamlet|
$doctype 5
.........
|]
但是我犯了错误 正如@Carsten所指出的,在这种情况下,您需要的是
shamlet
。关键是实现适当的ToMarkup
typeclass实例。我建议你阅读莎士比亚的模板。一个有效的例子:
data Person = Person
{ firstName :: String
, lastName :: String
} deriving Generic
instance ToJSON Person
type PersonAPI = "persons" :> Get '[JSON, HTML] [Person]
people :: [Person]
people =
[ Person "Isaac" "Newton"
, Person "Albert" "Einstein"
]
instance ToMarkup Person where
toMarkup person = showPerson person
-- this isn't properly implemented
preEscapedToMarkup p = showPerson p
-- HTML serialization of a list of persons
instance ToMarkup [Person] where
toMarkup persons = showPersons persons
preEscapedToMarkup p = showPersons p
showPerson :: Person -> Html
showPerson p = [shamlet|
<body>
<p>This is my page.
<h1>#{firstName p}
|]
showPersons :: [Person] -> Html
showPersons p = [shamlet|
<body>
<p>This is my page.
$forall person <- p
<h1>#{firstName person}
|]
data Person=Person
{firstName::String
,lastName::String
}派生泛型
实例ToJSON Person
键入PersonAPI=“persons”:>获取“[JSON,HTML][Person]
人::[人]
人=
[人“艾萨克”“牛顿”
,人称“阿尔伯特”“爱因斯坦”
]
实例来标记人在哪里
toMarkup person=showPerson
--这没有得到正确的实施
preEscapedToMarkup p=展示人p
--人员列表的HTML序列化
实例ToMarkup[Person]where
toMarkup PERSONERS=展示人员
preEscapedToMarkup p=展示人员p
showPerson::Person->Html
showPerson p=[shamlet|
这是我的页面。
#{firstName p}
|]
showPersons::[Person]->Html
表演者p=[shamlet|
这是我的页面。
$forall person正如@Carsten所指出的,在本例中,您需要的是shamlet
。关键是实现ToMarkup
typeclass的正确实例。我建议您在莎士比亚模板上阅读此内容。一个工作示例:
data Person = Person
{ firstName :: String
, lastName :: String
} deriving Generic
instance ToJSON Person
type PersonAPI = "persons" :> Get '[JSON, HTML] [Person]
people :: [Person]
people =
[ Person "Isaac" "Newton"
, Person "Albert" "Einstein"
]
instance ToMarkup Person where
toMarkup person = showPerson person
-- this isn't properly implemented
preEscapedToMarkup p = showPerson p
-- HTML serialization of a list of persons
instance ToMarkup [Person] where
toMarkup persons = showPersons persons
preEscapedToMarkup p = showPersons p
showPerson :: Person -> Html
showPerson p = [shamlet|
<body>
<p>This is my page.
<h1>#{firstName p}
|]
showPersons :: [Person] -> Html
showPersons p = [shamlet|
<body>
<p>This is my page.
$forall person <- p
<h1>#{firstName person}
|]
data Person=Person
{firstName::String
,lastName::String
}派生泛型
实例ToJSON Person
键入PersonAPI=“persons”:>获取“[JSON,HTML][Person]
人::[人]
人=
[人“艾萨克”“牛顿”
,人称“阿尔伯特”“爱因斯坦”
]
实例来标记人在哪里
toMarkup person=showPerson
--这没有得到正确的实施
preEscapedToMarkup p=展示人p
--人员列表的HTML序列化
实例ToMarkup[Person]where
toMarkup PERSONERS=展示人员
preEscapedToMarkup p=展示人员p
showPerson::Person->Html
showPerson p=[shamlet|
这是我的页面。
#{firstName p}
|]
showPersons::[Person]->Html
表演者p=[shamlet|
这是我的页面。
$forall person以下是一个适用于我的完整小示例:
{-# LANGUAGE DataKinds, PolyKinds, TypeOperators, DeriveGeneric #-}
{-# LANGUAGE QuasiQuotes #-}
module Main where
import Data.Aeson
import Data.Proxy
import GHC.Generics
import Network.Wai.Handler.Warp
import Servant.API
import Servant.HTML.Blaze
import Servant.Server
import Text.Blaze.Html
import Text.Hamlet
data Test = Test Int String
deriving (Generic)
instance ToJSON Test
type TestAPI
= "tests" :> Get '[JSON] [Test]
:<|> "Test.html" :> Get '[HTML] Html
main :: IO ()
main = run 8080 (serve (Proxy :: Proxy TestAPI) serverTestAPI)
serverTestAPI :: Server TestAPI
serverTestAPI = tests :<|> testHtml
tests = return [ Test 1 "Test 1"
, Test 2 "Test 2"
]
testHtml = return [shamlet|
$doctype 5
<html>
<head>
<title>This is a title
<body>
<p>This is text
|]
{-#语言数据类型、多类型、类型运算符、派生泛型}
{-#语言准语言}
模块主要在哪里
导入数据.Aeson
导入数据。代理
进口GHC.仿制药
导入Network.Wai.Handler.Warp
导入服务程序API
导入Servant.HTML.Blaze
导入服务服务器
导入Text.Blaze.Html
导入文本。哈姆雷特
数据测试=测试整型字符串
派生(通用)
实例测试
TestAPI型
=“测试”:>获取“[JSON][Test]
:“Test.html”:>获取“[html]html
main::IO()
main=run8080(服务(Proxy::Proxy TestAPI)服务器TestAPI)
serverTestAPI::serverTestAPI
serverTestAPI=tests:testHtml
测试=返回[测试1“测试1”
,测试2“测试2”
]
testHtml=return[shamlet|
$doctype 5
这是一个标题
这是文本
|]
下面是一个对我来说很有用的完整小示例:
{-# LANGUAGE DataKinds, PolyKinds, TypeOperators, DeriveGeneric #-}
{-# LANGUAGE QuasiQuotes #-}
module Main where
import Data.Aeson
import Data.Proxy
import GHC.Generics
import Network.Wai.Handler.Warp
import Servant.API
import Servant.HTML.Blaze
import Servant.Server
import Text.Blaze.Html
import Text.Hamlet
data Test = Test Int String
deriving (Generic)
instance ToJSON Test
type TestAPI
= "tests" :> Get '[JSON] [Test]
:<|> "Test.html" :> Get '[HTML] Html
main :: IO ()
main = run 8080 (serve (Proxy :: Proxy TestAPI) serverTestAPI)
serverTestAPI :: Server TestAPI
serverTestAPI = tests :<|> testHtml
tests = return [ Test 1 "Test 1"
, Test 2 "Test 2"
]
testHtml = return [shamlet|
$doctype 5
<html>
<head>
<title>This is a title
<body>
<p>This is text
|]
{-#语言数据类型、多类型、类型运算符、派生泛型}
{-#语言准语言}
模块主要在哪里
导入数据.Aeson
导入数据。代理
进口GHC.仿制药
导入Network.Wai.Handler.Warp
导入服务程序API
导入Servant.HTML.Blaze
导入服务服务器
导入Text.Blaze.Html
导入文本。哈姆雷特
数据测试=测试整型字符串
派生(通用)
实例测试
TestAPI型
=“测试”:>获取“[JSON][Test]
:“Test.html”:>获取“[html]html
main::IO()
main=run8080(服务(Proxy::Proxy TestAPI)服务器TestAPI)
serverTestAPI::serverTestAPI
serverTestAPI=tests:testHtml
测试=返回[测试1“测试1”
,测试2“测试2”
]
testHtml=return[shamlet|
$doctype 5
这是一个标题
这是文本
|]
谢谢大家的帮助!
执行情况如下:
键入TestAPI
=“测试”:>获取“[JSON][Test]
:“测试”:>获取'[JSON]测试
:“TestHTML.html”:>获取“[html]页面”\u TestHTML
serverTestAPI::ServerT TestAPI应用程序
serverTestAPI=测试
:测试
:testHtml
数据页\测试HTML=页面\测试HTML
实例来标记页面_TestHTML,其中
toMarkup Page_TestHTML=builderHtml
testHtml=返回页面\u testHtml
builderHtml=[shamlet|
$doctype 5
欢迎2
你好,世界HTML QQQQ |]
谢谢大家的帮助!
执行情况如下:
键入TestAPI
=“测试”:>获取“[JSON][Test]
:“测试”:>获取'[JSON]测试
:“TestHTML.html”:>获取“[html]页面”\u TestHTML
serverTestAPI::ServerT TestAPI应用程序
serverTestAPI=测试
:测试
:testHtml
数据页\测试HTML=页面\测试HTML
实例来标记页面_TestHTML,其中
toMarkup Page_TestHTML=builderHtml
testHtml=返回页面\u testHtml
builderHtml=[shamlet|
$doctype 5
欢迎2
你好,世界HTML QQQQ |]
显示了哪个错误?查看莎士比亚的文档,它看起来像哈姆雷特
QQ生成了HtmlUrl
类型的东西,但是香叶
生成了Html
类型的东西。是否使用香叶
代替h