首页 > 解决方案 > 如何从嵌套的同义词类型中获取价值

问题描述

我已经定义了自己的类型,称为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有正确的结果。但我可以Response摆脱我的类型CtrlV。有没有简单的方法来实现这一目标?

标签: haskelltypeshappstack

解决方案


要从您使用的库的细节中退一步,这里是如何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 上使用fand g,尽管它们是用“不同”类型声明的。Type 只是声明类型的同义词,而不是新类型(将使用newtype关键字)。

总而言之,您可以使用与使用CtrlV相同的方式,您Ctrlv' Response可以使用与使用相同的方式RouteT SiteMap App Response,您可以使用与使用相同的方式RouteT SiteMap (ServerPartT IO) Response,因为Ctrlv RouteT SiteMap (ServerPartT IO) Response


推荐阅读