如何从嵌套的同义词类型中获取值
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 上使用 f
和 g
,尽管它们是用 "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
.
我定义了自己的类型 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]:
的地方使用 ListOfIntsf :: 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 上使用 f
和 g
,尽管它们是用 "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
.