0
{-# LANGUAGE OverloadedStrings #-}

import Control.Applicative

import Data.Monoid
import Data.String

import Network.Wai.Middleware.RequestLogger

import Web.Scotty

data FullName = FullName { firstName :: String, lastName :: String }

lastFirst :: FullName -> String
lastFirst fn = lastName fn ++ ", " ++ firstName fn

main = scotty 3000 $ do
    middleware logStdoutDev

    get "/lastfirst/:fn/:ln" $ do
        fullName <- FullName <$> param "fn" <*> param "ln"
        html $ fromString (lastFirst fullName)

您可能注意到代码的最后一部分使用应用函数来构造记录,有人可以解释为什么不应该像往常一样创建它吗?

4

1 回答 1

2

这是因为param "fn"is不是a String,而是 anActionM产生 a String。我们不想将动作存储在 内部FullName,我们想运行动作,获取其结果并存储它。

我们可以按如下方式运行操作

get "/lastfirst/:fn/:ln" $ do
    fn <- param "fn"
    ln <- param "ln"
    let fullName = FullName fn ln
    html $ fromString (lastFirst fullName)

但应用语法更容易阅读。

于 2015-12-08T13:33:55.193 回答