以语义方式填充元组列表

2023-12-02

我正在编写一段代码,我必须处理元组列表,其中“键”的顺序和名称(fst元组的 s)匹配某个模板。我通过验证并(如果需要)根据输入生成有效列表来实现容错。

这是我的意思的一个例子:

给定密钥模板,["hello", "world", "this", "is", "a", "test"],和一个列表[("hello", Just 1), ("world", Just 2), ("test", Just 3)],将其传递给我的函数validate会导致验证失败 - 因为键的顺序和值与模板不匹配。

验证失败后,我想生成一个新列表,如下所示[("hello", Just 1), ("world", Just 2), ("this", Nothing), ("is", Nothing), ("a", Nothing), ("test", Just 3)].

我尝试使用(不完整的)列表理解来执行最后一步:

[(x, y) | x <- template, y <- l]

(显然,这缺少将空条目替换为Nothings,并在输入类型为假设的情况下工作[(String, Maybe Int)]).

执行此操作最简单的语义方法是什么?


你本质上想要map字符串列表的函数(您称之为“模板”),即该函数

  • 需要一个字符串xs,
  • returns
    • (xs, Just n)如果一个整数n关联到xs在您的“要验证的列表”中,
    • (xs, Nothing)否则。

这是一种可能的方法:

import Data.List     ( lookup )
import Control.Monad ( join )

consolidate :: [String] -> [(String, Maybe Int)] -> [(String, Maybe Int)]
consolidate temp l = map (\xs -> (xs, join $ lookup xs l)) temp

但是,如果您构建一个,您将获得更快的查找速度Map保存关联列表的键值对(“要验证的列表”):

import qualified Data.Map as M
import Data.Maybe (maybe)

consolidate :: [String] -> [(String, Maybe Int)] -> [(String, Maybe Int)]
consolidate temp l = map (\cs -> (cs, M.lookup cs $ fromList' l)) temp

fromList' :: Ord a => [(a, Maybe b)] -> M.Map a b
fromList' xs = foldr insertJust M.empty xs

insertJust :: Ord a => (a, Maybe b) -> M.Map a b -> M.Map a b
insertJust (xs, maybeVal) mp = maybe mp (\n -> M.insert xs n mp) maybeVal

In 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)]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以语义方式填充元组列表 的相关文章

随机推荐

  • java中如何通过超类实例调用子类方法?

    假设我们有一个超类 例如 public class Superclass public void method1 do something end Superclass 和一个子类 例如 public class Subclass exte
  • 仅从 Google Translate API 获取单一翻译

    所以我在 PHP 中使用 Google Translate API 如文档中所述 require vendor autoload php putenv GOOGLE APPLICATION CREDENTIALS src i18n php
  • 如何将 jQuery 函数应用于具有相同 ID 的所有元素?

    我是 jQuery 新手 我有以下代码 jQuery document ready function jQuery carousel jcarousel 它只适用于第一个ul with id carousel 不适合其他人 如何将它应用于具
  • 无法启动组件 [StandardEngine[Catalina].StandardHost[localhost]

    当尝试启动 tomcat 时 出现此错误 这可能是什么原因造成的 我浏览了很多类似的帖子 但找不到任何内容 我正在使用阿帕奇汤姆猫 v8 0和 JRE 1 8 0 java util concurrent ExecutionExceptio
  • 如何暂停applescript的执行一段时间?

    我在 Automator 中有一个小 applescript do shell script osascript Focus On scpt delay 60 do shell script osascript Focus Off scpt
  • 需要帮助将 qsort 与结构数组一起使用

    现在 我看到了各种例子 但我不明白它们的意思 这是我的结构 typedef struct profile char gender 1 double soc PROFILE 其中 soc 是我要排序的社会安全号码 我知道你需要一个比较函数 但
  • 构建一个没有源代码的linux模块

    我只是想知道 是否可以在没有源代码的情况下构建 插入模块 假设我下载了一个 openSuse 操作系统 但没有附带内核源代码 如何在不重新编译内核的情况下编译模块并插入模块 对于没有内核源码的openSuse来说 想要找到完全相同版本的源码
  • 传递给 sed 命令的 -n 参数有何意义?

    有人可以告诉我怎么做吗sed n 1 p工作 下面是我用来根据分配的节点对 k8s 中的 pod 进行排序的完整命令 kubectl get pods o wide all namespaces sort k8 r sed n 1 p 上面
  • 初始化二维数组而不指定大小

    我可以在 c 中初始化一维数组 无论是否初始化其大小 int x 1 2 3 4 5 int y 5 1 2 3 4 5 但是 当我尝试对二维数组执行相同操作时 例如 int x 1 2 3 4 5 6 我得到一个error array t
  • 为什么串口在Unity中不能正常工作?

    我需要帮助 我很绝望 在两周的时间里 我一直在研究我的项目 该项目使用串行端口通信 PIC 串行板 我必须设置连接 但无法从 COM 端口获取数据 我读过一些论坛 问题的原因似乎是执行不完整系统 IO 端口类 当我尝试获取 COM 端口的数
  • 何时使用:htmlspecialchars? [复制]

    这个问题在这里已经有答案了 我需要使用以下方法将字符串转换为特殊字符 htmlspecialchars 我的问题是 我应该在将数据提交到数据库之前对其进行转换 还是应该在显示数据之前对其进行转换 您应该在将数据插入数据库之前对其进行清理 并
  • 解释 Mike Bostock 的 d3.js Dragmove 函数

    我目前正在尝试在 d3 脚本中创建可拖动行为 我正在研究迈克博斯托克的例子 http bl ocks org mbostock 1557377 这是有问题的函数 function dragmove d d3 select this attr
  • 编译错误:需要标识符

    import java io public class details BufferedReader in new BufferedReader new InputStreamReader System in System out prin
  • 将字符串转换为浮点数 SQLAlchemy

    从数据库读取时有什么方法可以将字符串转换为浮点数吗 所以我的专栏size由字符串值组成 即 45 当我使用 SQL Alchemy 查询数据库时 如何获取浮点值 我知道最简单的方法是float value 但如果该值为NULL我需要处理捕获
  • Android 模拟器上的蓝牙支持

    我想知道制作模拟器的开发团队是否有一些信息可以使蓝牙在 Android 模拟器中工作 指出一些有关它的链接 他们是否有发布日期或者他们是否会使其在未来工作 据我所知 模拟器不支持蓝牙 我将不得不在一些课程中教授安卓和蓝牙 学生需要在 And
  • 查找当前文件夹的路径 - cmd

    我使用此脚本查找当前文件夹及其 bat 文件 for f i in 0 do set curpath dpi echo curpath 如果路径包含空格 它无法正常工作 D Scripts All Scripts gt 仅检索 D Scri
  • 无法播放 mp4 转换后的文件 - JavaFX 2.1

    我已经转换了我的 mov视频到 mp4 但是当我在 javafx 应用程序中播放视频时 它不起作用 我可以听到视频文件的音频 但没有图片 也许 mp4 的编解码器不正确 有什么想法或解决方案吗 UPDATE 使用相同的代码 我在相同的条件下
  • Swagger Gateway 微服务聚合

    我正在使用 SpringBoot 开发一个微服务应用程序 有面向公众的网关微服务 它将请求重定向到特定的微服务 在不同的主机上运行 现在 我有多个微服务 每个微服务都使用 Swagger 公开了它们的 API 我们希望为公共客户聚合所有这些
  • 如何从 extjs 4 商店获取数据

    我一开始就使用 ext js 4 我试图在使用 store 启动应用程序时获取当前用户数据 但我没有从商店获取任何数据 甚至 store count 返回 0 我发现很多描述如何创建存储 但没有描述如何访问其中的数据 我设法使用 Ext a
  • 以语义方式填充元组列表

    我正在编写一段代码 我必须处理元组列表 其中 键 的顺序和名称 fst元组的 s 匹配某个模板 我通过验证并 如果需要 根据输入生成有效列表来实现容错 这是我的意思的一个例子 给定密钥模板 hello world this is a tes