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

时间:2018-08-24 11:59:51

标签: haskell types happstack

我已经定义了自己的类型,称为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。 有一个简单的方法可以做到这一点吗?

1 个答案:

答案 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上同时使用fg,尽管它们是用“不同”类型声明的。 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); });