Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 与莎士比亚一起使用仆人(哈姆雷特、朱利叶斯、卢修斯)_Haskell_Yesod_Servant - Fatal编程技术网

Haskell 与莎士比亚一起使用仆人(哈姆雷特、朱利叶斯、卢修斯)

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

如何将莎士比亚(来自yesod)用于服务Web服务API

我尝试:

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