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她说,这听起来像是一个有前途的线索。