我已经定义了自己的类型,称为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
。
有一个简单的方法可以做到这一点吗?
答案 0 :(得分:2)
要退出使用的库的详细信息,请参见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
,尽管它们是用“不同”类型声明的。 Type仅声明类型的同义词,而不是新类型(它将使用newtype
关键字)。
总而言之,您可以像使用CtrlV
一样使用Ctrlv' Response
,也可以像使用RouteT SiteMap App Response
一样使用RouteT SiteMap (ServerPartT IO) Response
将使用Ctrlv
,因为RouteT SiteMap (ServerPartT IO) Response
是 jQuery('.dig-pub').on('click', function() {
url = jQuery(this).parent().find('a').attr('href');
jQuery(location).attr(url);
});
。