haskell - 如何从嵌套的同义词类型中获取价值
问题描述
我已经定义了自己的类型,称为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
。有没有简单的方法来实现这一目标?
解决方案
要从您使用的库的细节中退一步,这里是如何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
and g
,尽管它们是用“不同”类型声明的。Type 只是声明类型的同义词,而不是新类型(将使用newtype
关键字)。
总而言之,您可以使用与使用CtrlV
相同的方式,您Ctrlv' Response
可以使用与使用相同的方式RouteT SiteMap App Response
,您可以使用与使用相同的方式RouteT SiteMap (ServerPartT IO) Response
,因为Ctrlv
是 RouteT SiteMap (ServerPartT IO) Response
。
推荐阅读
- typescript - 尽管在 .eslintrc.js 中提到了规则,但导入错误
- asp.net-core - nginx 作为反向代理会丢失 cookie
- flutter - 在颤动中截屏时出现黑屏
- mysql - SQLSTATE [42S02]:未找到基表或视图:1146 表 'dream.category_course' 不存在
- python - Python 代码适用于解释器,但在我使用 pyinstaller 时不起作用
- c# - 如何在 Azure 应用服务中升级 .Net 框架之前或之后维护应用程序
- python - 如何绘制跨基因组坐标的 log2 倍数变化(使用 Deseq2 输出 csv)
- revit-api - 无法在 Revit 文件的视图中隐藏元素类别
- math - 圆形的二维标识符?
- javascript - JavaScript 从数组或函数为 nivo 生成 json 数据