如何从嵌套的同义词类型中获取值

How to get value out of nested synonym type

我定义了自己的类型 CtrlV:

{-# LANGUAGE TemplateHaskell #-}
import Data.Data (Data, Typeable)
import Happstack.Server (Response, ServerPartT)
import Web.Routes (RouteT)
import Web.Routes.TH (derivePathInfo)

type App = ServerPartT IO
type CtrlV'   = RouteT Sitemap App
type CtrlV    = CtrlV' Response

data Sitemap   = Home | User
    deriving (Eq, Ord, Read, Show, Typeable, Data)
$(derivePathInfo ''Sitemap)

我有这个功能,例如:

import Happstack.Foundation
import Happstack.Server (ok, toResponse)
import Web.Routes (showURL)
createResponse :: CtrlV
createResponse = do
     url <- showURL Home
     ok $ toResponse (show url)

我想为此函数编写一个测试,我想检查 Response 是否有正确的结果。但是我可以从我的类型 CtrlV 中得到 Response。 有没有简单的方法可以做到这一点?

从您使用的库的细节上退一步,以下是 type 的工作原理:

我可以声明一个类型同义词

type ListOfInts = [Int]

我知道我可以在任何需要使用 [Int]:

的地方使用 ListOfInts
f :: ListOfInts -> Int
f xs = sum xs

g :: [Int] -> Int
g xs = product xs

list1 :: [Int]
list1 = [1,2,3]

list2 :: ListOfInts
list2 = [4,5,6]

f list1
> 6
f list2
> 15

g list1
> 6
g list2
> 120

现在我可以在 list1 和 list2 上使用 fg,尽管它们是用 "different" 类型声明的。 Type 只是声明一个类型的同义词,而不是一个新类型(它将使用 newtype 关键字)。

总而言之,您可以像使用 Ctrlv' Response 一样使用 CtrlV,也可以像使用 RouteT SiteMap App Response 一样使用 RouteT SiteMap App Response你会使用 RouteT SiteMap (ServerPartT IO) Response 的方式,因为 Ctrlv RouteT SiteMap (ServerPartT IO) Response.