Haskell 以语义方式填充元组列表
我正在编写一段代码,其中必须处理元组列表,其中“键”(Haskell 以语义方式填充元组列表,haskell,list-comprehension,Haskell,List Comprehension,我正在编写一段代码,其中必须处理元组列表,其中“键”(fsts元组)的顺序和名称都与某个模板匹配。我通过验证并(如果需要)根据输入生成有效列表来实现容错 这里有一个例子来说明我的意思: 给定密钥模板,[“hello”、“world”、“this”、“is”、“a”、“test”]和一个列表[(“hello”,Just 1),(“world”,Just 2),(“test”,Just 3)],将其传递给我的函数validate将导致验证失败,因为密钥的顺序和值与模板不匹配 验证失败后,我想生成一个
fst
s元组)的顺序和名称都与某个模板匹配。我通过验证并(如果需要)根据输入生成有效列表来实现容错
这里有一个例子来说明我的意思:
给定密钥模板,[“hello”、“world”、“this”、“is”、“a”、“test”]
和一个列表[(“hello”,Just 1),(“world”,Just 2),(“test”,Just 3)]
,将其传递给我的函数validate
将导致验证失败,因为密钥的顺序和值与模板不匹配
验证失败后,我想生成一个新列表,它看起来像[(“hello”,仅1),(“world”,仅2),(“this”,Nothing),(“is”,Nothing),(“a”,Nothing),(“test”,仅3)]
我尝试使用(不完整的)列表理解执行最后一步:
[(x, y) | x <- template, y <- l]
[(x,y)|x您基本上希望将函数映射到字符串列表(您称之为“模板”),即
- 获取字符串
xs
- 返回
(xs,仅n)
如果一个整数n
与“要验证的列表”中的xs
相关联
(xs,无)
否则
以下是一种可能的方法:
导入数据列表(查找)
导入控制.Monad(join)
合并::[String]->[(String,可能是Int)]->[(String,可能是Int)]
合并临时l=map(\xs->(xs,join$lookup xs l))临时
但是,如果您构建一个保存关联列表(“要验证的列表”)的键值对的列表,您将获得更快的查找速度:
导入符合条件的数据。映射为M
导入数据。可能(可能)
合并::[String]->[(String,可能是Int)]->[(String,可能是Int)]
合并临时l=map(\cs->(cs,M.lookup cs$fromList'l))临时
fromList'::orda=>[(a,也许b)]->M.映射a b
fromList'xs=foldr insertJust M.empty xs
insertJust::orda=>(a,也许b)->M.mapab->M.mapab
insertJust(xs,maybeVal)mp=maybeVal(\n->M.insert xs n mp)maybeVal
在GHCi中:
λ> let myTemplate = ["hello", "world", "this", "is", "a", "test"]
λ> let myList = [("hello", Just 1), ("world", Just 2), ("test", Just 3)]
λ> consolidate myTemplate myList
[("hello",Just 1),("world",Just 2),("this",Nothing),("is",Nothing),("a",Nothing),("test",Just 3)]
您是否考虑过使用映射字符串Int
作为“要验证的列表”的中间表示形式?然后您可以沿着模板走,构建一个新的[(字符串,可能是Int)]
值,当一个值与地图中焦点下的字符串关联时,通过填充Int
值。你能为此将我链接到docpage吗?我还是从Haskell开始,谷歌搜索只会分别显示一堆关于地图
、字符串
和Int
类型的页面。Ot她说,这听起来像是一个有前途的线索。