了解filterM

2024-03-18

Consider

filterM (\x -> [True, False]) [1, 2, 3]

我只是无法理解 Haskell 对此的魔力filterM用例。该函数的源码如下:

filterM          :: (Monad m) => (a -> m Bool) -> [a] -> m [a]
filterM _ []     =  return []
filterM p (x:xs) =  do
    flg <- p x
    ys  <- filterM p xs
    return (if flg then x:ys else ys)

通过这个用例,p应该是 lambda 函数(\x -> [True, False]),以及第一个x应该1。那么什么是flg <- p x返回?到底有什么价值flg对于每个递归?


列表单子[] models 非决定论:值列表[a]代表了值的多种不同可能性a.

当你看到这样的声明时flg <- p x在单子列表中,flg将取每个值p x反过来,即True进而False在这种情况下。身体的其余部分filterM然后执行两次,每个值执行一次flg.

要更详细地了解这是如何发生的,您需要了解do符号和实施(>>=)列表 monad 的运算符。

do符号被逐行脱糖到对(>>=)操作员。例如非空的bodyfilterM案件变成

p x >>= \flg -> (filterM p xs >>= \ys -> return (if flg then x:ys else ys))

这完全是机械的,因为它本质上只是替换flg <-在表达式之前>>= \flg ->表达后。实际上,模式匹配使事情变得更复杂一些,但也不是太复杂。

接下来就是实际执行了(>>=),这是一个成员Monad类型类,并且每个实例都有不同的实现。为了[],类型为:

(>>=) :: [a] -> (a -> [b]) -> [b]

和实施是这样的

[] >>= f = []
(x:xs) >>= f = f x ++ (xs >>= f)

所以循环发生在(>>=)。这一切都在一个库中,除了脱糖之外没有任何编译器魔法do符号。

等效定义为(>>=) is

 xs >>= f = concat (map f xs)

这也可以帮助您了解正在发生的情况。

递归调用也会发生同样的事情filterM:对于每个值flg,进行递归调用并生成结果列表,最后的return对每个元素执行语句ys在此结果列表中。

每次递归调用的这种“扇出”会导致2^3 = 8最终结果中的元素filterM (\x -> [True, False]) [1, 2, 3].

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

了解filterM 的相关文章

  • Python 比编译的 Haskell 更快?

    我有一个用 Python 和 Haskell 编写的简单脚本 它读取包含 1 000 000 个换行符分隔的整数的文件 将该文件解析为整数列表 对其进行快速排序 然后将其写入已排序的不同文件中 该文件与未排序的文件具有相同的格式 简单的 这
  • 使用 Parsec 解析正则表达式

    我正在尝试通过实现一个小型正则表达式解析器来学习秒差距 在 BNF 中 我的语法类似于 EXP EXP LIT EXP LIT 我尝试在 Haskell 中实现这一点 expr try star lt gt try litE lt gt l
  • 检索 Haskell 项目中所有导入的列表

    因此 我的最终目标是通过确保项目导入的所有实体都存在于其声称可以使用的版本中 来评估 cabal 文件中依赖项的准确性 一个好的开始是找到单个源文件使用的所有导入实体的列表 可选地包含有关它们来自何处的信息 我愿意暂时忽略类实例的情况 因为
  • 来自数据类型的 Haskell 随机数

    我对 Haskell 还很陌生 我有一个数据类型 data Sentence Prop Int No Sentence And Sentence Or Sentence deriving Eq 我已经为它写了一个 Show 实例 然而 无论
  • 不同类型的列表?

    data Plane Plane point Point normal Vector Double data Sphere Sphere center Point radius Double class Shape s where inte
  • Haskell 五个独特的 Wordle 单词

    为了好玩 我正在尝试解决 Matt Parker 在他的 Haskell 频道 Standup Maths in Haskell 频道的链接视频中谈到的与 Wordle 相关的问题 基本上 找到 5 个没有任何共同字母的 5 个字母单词 因
  • 在 Scala 中创建任意类作为 monad 实例

    为了使任何东西都可以在 monad 上下文中操作 如果使用 Haskell 我只需在任何地方为给定类型添加类 Monad 的实现 所以我根本不接触数据类型定义的来源 像 人造的东西 data Z a MyZLeft a MyZRight a
  • 不理解 Monoid 定义中态射的表示法

    我试图理解什么Monoid是从范畴论的角度来看的 但我对用来描述它的符号有点困惑 这是维基百科 在范畴论中 幺半群范畴 C I 中的幺半群 或幺半群对象 M 是一个对象 M 和两个态射 M M M 称为乘法 I M 称为单位 我的困惑在于态
  • Haskell 有 takeUntil 函数吗?

    目前我正在使用 takeWhile x gt x 1 x 89 l 从列表中获取最多为 1 或 89 的元素 但是 结果不包括这些标记值 Haskell 是否有一个标准函数可以提供这种变化takeWhile结果中包含哨兵 到目前为止 我对胡
  • parList 和 parBuffer 如何选择?

    我从 haskell 并行开始 我已经成功学习了如何使用一些策略 例如 r0 rseq rdeepseq parList parMap 现在我正在进一步寻求更高的效率 所以这是我的问题 有什么区别parList and parBuffer
  • kind 类型的函子和应用词 (* -> *) -> *

    我遇到了一种情况 我的代码将受益于使用Functor and Applicative 类似抽象 但针对种类类型 gt gt 定义一个更高种类的函子可以通过RankNTypes像这样 class HFunctor f where hfmap
  • 如何给Servant中的所有端点添加前缀?

    我在 Haskell 仆人中有一个 hello world 应用程序 这是其中的一部分 type API my items gt Get JSON MyItem lt gt my items gt Capture id Int gt Get
  • Haskell:先进先出队列算法的复杂性

    这是我对 FIFO 队列的尝试 type Queue a a gt a empty Queue a empty id remove Int gt Queue a gt a Queue a remove n queue take n queu
  • 如何在递归方案中派生实例

    我正在测试其中的一些想法本文 http blog sumtypeofway com an introduction to recursion schemes 我想派生 Term 类型的 Eq 实例 LANGUAGE DeriveFuncto
  • 模式匹配中的 Monoid mempty

    我尝试写一个通用的maximum功能类似于Prelude 我的第一个天真的方法如下所示 maximum F Foldable a Ord b gt a b gt Maybe b maximum mempty Nothing maximum
  • Haskell GHC:具有 N 个构造函数的模式匹配的时间复杂度是多少?

    假设我们有以下 Haskell data T T0 T1 T2 TN toInt T gt Int toInt t case t of T0 gt 0 T1 gt 1 T2 gt 2 TN gt N 这里使用什么算法来执行模式匹配 我看到两
  • 结构上强制的自由替代,没有左派分配性

    有一个不错的免费替代品 http hackage haskell org package free 4 12 4 docs Control Alternative Free html在伟大的free包 它将函子提升到左分配替代方案 也就是说
  • Clojure 的映射和减少 Monad...Juxt Monad 怎么样?

    在学习 Clojure 的过程中 我花了很长时间试图理解 monad 它们是什么以及我们如何使用它们 但没有取得太大成功 然而 我发现了一个很棒的 Monads for Dummies 视频系列 http vimeo com 2071730
  • 绑定变量时 Haskell 中的无限循环

    下面的 Haskell 代码不会终止 有人可以解释一下为什么吗 谢谢 f let x 10 in let x x x in x 我认为解释器首先绑定 x 10 然后将 x x 计算为 100 并绑定 x 100 环境变为 x 100 那么整
  • Haskell:如何创建将函数应用于元组项的最通用函数

    这是一个个人练习 旨在更好地理解 Haskell 类型系统的局限性 我想创建最通用的函数 将某些函数应用于 2 条目元组中的每个条目 例如 applyToTuple fn a b fn a fn b 我试图让这个函数在以下每种情况下都起作用

随机推荐

  • 删除条形图之间的空间ggplot2

    这是我的代码 ggplot df aes x timepoint y mean fill group geom bar position position dodge 3 colour black stat identity width 0
  • ValueTuple.Create 中的命名参数

    我正在研究 C 中的值元组 首先是一些演示数据 region Data public class Product public string Name get set public int CategoryID get set public
  • 从 Word 中的内容控件提取数据到 Excel

    我有一个 可填写表单 的 Word 文档 即其中包含内容控制对象 例如富文本和日期选择器内容控件 我希望将特定字段的数据提取到 Excel 中 例如 每个表单都有项目标题 开始日期和经理 我想要该表格的 1 行包含这三项数据 最终 每隔几个
  • 如何使用 python 解析 json 对象?

    我正在尝试解析 json 对象并遇到问题 import json record shirt red quanitity 100 blue quantity 10 pants black quantity 50 inventory json
  • 为什么 JavaScript 展开表示法在这里不起作用

    我正在学习 React 有一个我无法解决的简单问题 我创建了一个代码沙盒 https codesandbox io s react dropzone sha256 5ngg7 file src FileUpload js 在图像中 file
  • 在 ArrayController 模型的过滤子集上设置 itemController

    问题摘要 虽然我可以让集合的子级 在 ArrayController 上定义 为个体使用特定的对象控制器 但这不适用于已过滤的子级子集 简短的上下文 我有订阅 其中有项目 我想按类型过滤视图中的订阅 并让这些订阅中的项目按时间戳排序 这是订
  • 在 R 中按组引导结果向量

    Question 如何使用引导程序来获取一组数据的置信区间 根据协方差矩阵的特征值计算的统计数据 分别为 数据框中的每个组 因子水平 Problem 数据不太清楚 结构我需要包含这些适合的结果boot函数 或者一种在组上 映射 引导程序并以
  • 如何验证 DataGridView 输入?

    我有一些严重的问题数据网格视图输入验证 我正在使用实体框架开发一个项目 并且我已经绑定了数据网格视图元素到数据库 如果用户将一些数据插入到不可为空的列中 然后清除数据以使该列留空 然后单击另一个数据网格视图单元格时 发生异常并且出现运行时错
  • 使用 Python/Pandas 对非系统/排列数据进行平均和绘制

    我有一个非系统 整理的数据如下 x y 0 049098 82854 2105263158 0 049058 82472 2368421053 0 066427 84358 3421052632 0 066465 83842 9210526
  • WPF:禁用选项卡控件上的箭头键

    我在应用程序中使用 WPF TabControl 以便在程序的不同区域 功能之间切换 不过有一件事让我很恼火 我隐藏了选项卡 这样我就可以控制选定的选项卡 而不是用户 然而 用户仍然可以使用箭头键在选项卡之间切换 我尝试过使用 Keyboa
  • 如何列出 FastAPI 中所有定义的 URL 路径?

    假设我有一个包含 100 多个 API 端点的 FastAPI 项目 如何列出所有 API 路径 为了获取所有可能的 URL 模式 我们需要访问定义的 URL 路由这是正在运行的应用程序实例的一个属性 我们至少可以通过两种方式做到这一点 U
  • 你的 Nvarchar() 有多大

    设计数据库时 在决定 nvarchar 应该有多大时 您会考虑哪些决定 如果我要制作一个地址表 我的直觉反应是地址行 1 为 nvarchar 255 就像旧的访问数据库一样 我发现使用这个让我对旧的 字符串将被截断 感到烦恼 我知道可以通
  • 在 C# 中返回 SortedList 中的第一个元素

    我有一个SortedList在 C 中 我想返回列表的第一个元素 我尝试使用 First 功能 但它并没有真正起作用 有人可以告诉我该怎么做吗 对彼此而言SortedList https learn microsoft com en us
  • angularjs 禁用 $http/$q 调用上的按钮

    遵循 DRY 原则 我想编写一个按钮指令 在 http 类的持续时间内保持按钮禁用 我想这样做是为了禁止用户多次单击按钮 但我无法考虑如何在指令内获取函数承诺状态 因为该函数驻留在 scope 上 这个场景非常通用 按钮 ng click
  • WebDriverWait + 搜索项目

    创建激活码后 需要 1 60 秒的时间将代码上传到系统中 因此 在创建新代码后 我想使用 WebDriverWait 60 秒来确保在这段时间内每 3 秒我想单击 搜索 按钮 有什么办法可以做到这一点吗 new WebDriverWait
  • 安全、密码学:愚蠢的挑战 - 响应协议?

    好吧 大家只是一个小游戏 我有一个项目的一些规格 在某些时候 他们要求以下内容通过网络加密密码 并称这是一个质询响应协议 CLIENT SERVER 1 ask for challenge gt 2 lt send SHA1 taken f
  • Safari 错误未定义不是对象

    我在这里阅读了一些关于我的问题的帖子 但我不知道如何将其应用到我的代码中 因为我不使用数组或其他对象 在 Safari 中我收到此错误 TypeError undefined is not an object evaluating rela
  • 是否可以使用 WIX 创建多语言安装程序?

    是否可以使用 WIX 创建多语言安装程序 如果您创建嵌入式转换 则无需引导程序即可执行此操作 并且 MSI 安装程序将根据您的系统区域设置自动应用其中之一 有关完整的详细信息和脚本 请点击以下链接 http www geektieguy c
  • 无法将“%26”传递到 WCF 服务中的 WebGet UriTemplate 变量?

    我有一个带有此声明操作的 WCF 服务 WebGet UriTemplate Test testString public String Test String testString return testString 但是当尝试调用 UR
  • 了解filterM

    Consider filterM x gt True False 1 2 3 我只是无法理解 Haskell 对此的魔力filterM用例 该函数的源码如下 filterM Monad m gt a gt m Bool gt a gt m