如何理解 Haskell 中的“$”用法[重复]

2023-12-24

当您想要将一堆函数应用于同一个变量时,就会发生这种情况,它可能如下所示:

map (\f->f 4) [odd, even]

但从LYAH http://learnyouahaskell.com/higher-order-functions using $使它非常整洁

map ($ 4) [odd, even]

为什么它有效。首先我在 ghci 中输入它$ 4 odd,失败了,然后我输入($ 4) odd,效果很好。然后我检查类型($ 4) using :t这表明($ 4) :: Num a => (a -> b) -> b, odd is odd :: Integral a => a -> Bool。似乎有道理,但我仍然不清楚。

谁能解释清楚,这是另一种常见用法吗$,还有其他更多用法吗$.


操作员解剖

The $应用程序运算符的形式为:

($) :: (a -> b) -> a -> b

当您想要避免尾随一对括号时,经常会出现这种情况:

func a (b + c)

等于:

func a $ b + c

这背后的魔力可以简单地解释为固定性声明 http://www.haskell.org/haskellwiki/Keywords#infixr:

infixr 0

这意味着:之后的一切$将被分组为一个实体,就像它们被括在括号中一样。

当然,这也可以像这样“嵌套”:

func a $ b + other $ c - d

意思是:

func a (b + other (c - d))

作为函数的应用程序运算符

你的案例非常有趣,根据我的经验,不经常使用。

我们来分析一下:

map ($ 4) [odd, even]

我们知道map的类型是:

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

如果有人忘记了,其行为是:采用第一个参数(来自a to b)并将其应用到每个a在第二个参数列表中,最终返回结果列表。

你可以看到($ 4)作为“将 4 作为参数传递给某事物”。意思就是:

($ 4) func

是相同的:

func $ 4

So:

map ($ 4) [odd, even]

means:

[($ 4) odd, ($ 4) even]
[(odd $ 4), (even $ 4)]
[False, True]

为什么 (func $) 不是必需的

你可以争论,就像你可以做的那样(/ 4) and (2 /)分别表示“某物除以 4”和“2 除以某物”,你可以这样做($ 4) and (func $)你是对的。

In fact:

(func $) 4

是相同的:

func $ 4
func 4

与以下内容相同:

($ 4) func

但现实是:

map (func $) [...]

是不必要的,因为第一个参数map始终应用于列表中的每个参数,使上面的内容与以下内容相同:

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

如何理解 Haskell 中的“$”用法[重复] 的相关文章

  • 树莓派 2 上的 GHCi?

    我正在开发一些在 raspberry pi 2 上运行的 haskell 项目 以及可以使用 raspbian 7 4 1 中的 apt get 安装的 ghc 版本 但它没有 GHCi 这会阻止一些重要的包 如 Vector 的编译 我看
  • 如何同时将透镜(或任何其他光学器件)视为吸气剂和设置剂?

    我正在尝试编写一个通用记录更新程序 它允许人们轻松更新记录中的字段existing记录 字段形状相似incoming记录 这是我到目前为止所拥有的 applyUpdater fields existing incoming let gett
  • 这些 Python 符号是什么:“[ [] ] * n”和“(i,)”

    有人可以澄清一下Python中的这两个符号吗 n 显然这会创建对同一对象的 n 个引用 在本例中是一个空列表 这在哪些情况下有用 i 我看到有些人使用这种 尾随逗号 表示法 例如 生成 0 1 2 n 1 的所有大小为 k 的子集 http
  • 如何在 Haskell Pipes 中将两个 Consumer 合并为一个?

    我使用Haskell流处理库pipes https hackage haskell org package pipes编写一个命令行工具 每个命令行操作都可以将结果输出到stdout并记录到stderr with pipes API I n
  • javascript 函数后面括号中的值

    我正在尝试重新利用我在 SO 的答案中找到的一些 Javascript 代码 但我想首先更好地理解它的语法 其大纲是 function root ns factory some code window detectZoom function
  • cabal install wx 缺少 C 库

    Env 操作系统 feodra 16 Haskell 平台 wxGTK 开发 GHHC 7 0 4 我正在尝试安装 wxHaskell 阴谋集团安装wx 然后给出这些错误 缺少对外国库的依赖 缺少 C 库 wx baseu 2 8 wx b
  • 用于将具有相同前缀的所有变量的值相加的 SPSS 语法

    我想知道是否有一种方法可以让 SPSS 将具有相同前缀的所有变量相加 例如 我有名为MFQAP 1 MFQAP 2 MFQAP 3等等 有没有办法告诉SPSS将所有以以下开头的变量相加MFQAP 我知道我可以告诉 SPSS 将所有变量相加M
  • to_proc 方法在 Ruby 中意味着什么?

    我正在学习 Rails 并关注这个线程 https stackoverflow com questions 1961030 我被困住了to proc方法 我认为符号只是字符串的替代品 它们就像字符串 但在内存方面更便宜 如果我还缺少任何其他
  • Haskell 中多核编程的现状如何?

    Haskell 中多核编程的现状如何 现在有哪些项目 工具和库可用 有哪些经验报道 2009年至2012年期间 发生了以下事件 2012 从 2012 年开始 并行 Haskell 状态更新开始出现在并行 Haskell 摘要 http w
  • Haskell / cabal 包的解决方法受到 Nix 和 Cabal 的限制?

    我最近开始开发反射平台 https github com reflex frp reflex platform 有一些额外的配置类似于优秀的反射项目骨架 https github com ElvishJerricco reflex proj
  • 并行 Haskell - GHC GC 火花

    我有一个正在尝试并行化的程序 带有可运行代码的完整粘贴here http lpaste net 101528 我进行了分析 发现大部分时间都花在findNearest这本质上是一个简单的foldr超过一个大Data Map findNear
  • 这是 unsafeCoerce 的安全使用吗?

    我遇到的情况是 我目前正在使用极其可怕的函数 unsafeCoerce 幸运的是 这并不是为了任何重要的事情 但我想知道这是否是该函数的安全使用 或者是否有其他方法可以解决其他人知道的这个特定问题 我的代码类似于以下内容 data Toke
  • jquery 隐藏简单的 javascript 错误

    我在 chrome 和 firefox 中使用 jQuery 和 flot 当我编写代码时 我发现执行在一些愚蠢的事情上会默默失败 例如访问不存在的哈希结构等 感觉 jQuery 中有一些 try catch 逻辑 让我看不到任何错误 有没
  • 与 Functor 不同,Monad 可以改变形状?

    我一直很喜欢以下关于单子相对于函子的力量的直观解释 单子可以改变形状 函子不能 例如 length fmap f 1 2 3 总是等于3 然而 对于单子来说 length 1 2 3 gt gt g往往不等于3 例如 如果g定义为 g Nu
  • 使用默认值压缩而不是删除值?

    我正在 haskell 中寻找一个函数来压缩两个长度可能不同的列表 我能找到的所有 zip 函数都只是删除列表中比其他列表长的所有值 例如 在我的练习中 我有两个示例列表 如果第一个比第二个短 我必须用 0 填充 否则我必须使用 1 我不允
  • 在 Archlinux 上使用 Vim 作为 Haskell 的 IDE 目前情况如何?

    如果可行的话 我的目标是通过 YouCompleteMe 在 Vim 中完成 Haskell 的命令 在这方面 正如您在下面看到的 我还没有找到关于如何让它发挥作用的共识 相关评论的最新评论YouCompleteMe 上的问题 https
  • 如何与更高级别的类型合作

    玩弄教堂的数字 我遇到了无法指导 GHC 类型检查器处理高阶类型的情况 首先我写了一个版本 没有任何类型签名 module ChurchStripped where zero z z inc n z s s n z s natInteger
  • 找到将一个数字转换为另一个数字的最小移动次数的算法

    假设我们有两个正整数 a 和 b 每次移动我们都可以将 a 除以 2 但前提是 a 是偶数 将 a 乘以 2 或者将 a 加 1 将a变为b需要多少步 找到一个直接公式或一种有效的算法 即以对数时间运行的算法 我取得的一些进展 我们可以把它
  • 不同类型的列表?

    data Plane Plane point Point normal Vector Double data Sphere Sphere center Point radius Double class Shape s where inte
  • 函数式语言与语言实现的角度有何不同

    出现了全新的 函数式编程 范式 与过程式编程相比 它需要彻底改变思维模式 它使用高阶函数 纯度 单子等 我们通常在命令式和面向对象语言中不会看到这些 我的问题是如何执行这些语言与命令式或面向对象语言的不同之处在于 例如内存管理或指针等内部结

随机推荐

  • 当用户未登录时,Servlet 过滤器在无限重定向循环中运行

    我有两个 HTML 文件 登录 html 测试 html 我的要求是用户不应该能够访问 test html 除非他通过 login html 成功登录 这是我的login html 文件
  • 快速 (< n^2) 聚类算法

    我有 100 万个 5 维点 需要将它们分组为 k 个簇 其中 k 但 我需要运行时间远低于 n 2 n log n 左右应该没问题 我进行此聚类的原因是为了避免计算所有 n 个点的距离矩阵 这需要 n 2 时间或多个小时 而是我只想计算聚
  • Linq-to-Entity 查询的动态谓词

    以下 Linq to Entities 查询工作正常 var query repository Where r gt r YearProp1 HasValue r YearProp1 gt minYear r YearProp1 lt ma
  • 使用实体框架删除项目

    我正在尝试使用实体框架删除一个对象 在互联网上的所有教程中 我发现为了做到这一点 您必须调用DeleteObject方法结合上下文 我尝试这样做 但似乎我没有DeleteObject方法 这是我的代码 public void DeleteB
  • 选择子网格中的行会选择父网格中具有相同行索引的行

    我已经在 Rowexpander 插件中实现了嵌套网格 现在的问题是 当我选择子网格的任何第 n 行时 父网格第 n 行也会被选中 我认为因为两者都有相同的 rowIndex 即使当我将鼠标悬停在子网格行上时 父级也会同时显示相同的鼠标悬停
  • cpp中的接口

    我想在 cpp 中创建接口 这样任何类都实现该类 那么该类必须实现父类的函数 如果所有功能都没有实现 那么它一定会显示错误 class parent interface class public virtual void display c
  • socket.io,动态添加消息处理程序

    我很高兴编写了一个node js 服务器 它使用socket io 与客户端通信 这一切都运作良好 socket on connection 处理程序有点大 这让我想到了另一种组织代码并将处理程序添加到生成器函数中的方法 如下所示 sess
  • AWS Lambda“进程在完成请求之前退出”

    我正在尝试打电话DynamoDB客户端方法并从 DynamoDB 表中获取一项 我在用AWS Lambda 然而 我不断收到这样的消息 进程在完成请求之前退出 我增加了超时只是为了确保 但处理时间小于超时 有什么建议吗 console lo
  • OnResume 在片段内多次调用

    I have 内部片段里面包含RecyclerView主片段添加到浏览器 当 MainFragment 被创建时 同时滑动 OnResume 被多次调用 第一次 OnResume 在 MainFragment 中调用一次 在 InnerFr
  • Ruby,检查字符串是否都是有效的十六进制字符?

    我必须检查 4 个字符的字符串是否都是有效的十六进制 我发现了另一个问题 它准确地演示了我想要做什么 但它是 Java 用于检查字符串仅包含十六进制字符的正则表达式 https stackoverflow com questions 531
  • 如何使用逆 CDF 在 Python 中随机采样对数正态数据并指定目标百分位数?

    我正在尝试从 Python 中的对数正态分布生成随机样本 该应用程序用于模拟网络流量 我想生成这样的样本 模态样本结果为 320 10 2 5 80 的样本位于 100 到 1000 10 2 到 10 3 范围内 我的策略是使用逆 CDF
  • 为什么 localStorage["..."] 未定义,但 localStorage.getItem("...") 为 null?

    上次我检查时 返回了以下两行true null localStorage foo null localStorage getItem foo 更换时同样适用null with undefined 那么第一个问题是 为什么有两种方式来寻址lo
  • 在 Google 表单上创建动态问题

    我在谷歌电子表格中有数百张图像的网址列表 我想创建一个谷歌表单 动态选择其中 50 张图像 显示它们并询问一个喜欢 讨厌的通用问题 然后将此数据与 URL 一起提交到电子表格 有没有办法动态地做到这一点 AFAIK 您可以使用函数使用应用程
  • Oauth2 Access Token 可以被客户端共享吗?

    我是 OAUTH 的新手 正在尝试理解该规范 所以根据规范协议流程 https www rfc editor org rfc rfc6749 section 1 2 据我了解 客户端 A 可以获得受保护资源的授权代码和访问令牌 现在 如果已
  • 我的 JBoss 服务器在 Linux 上达到 100% SYS CPU;什么会导致这种情况?

    我们已经调试这个 JBoss 服务器问题很长时间了 大约工作 10 小时后 服务器陷入 100 CPU 恐慌攻击并停止运行 在此期间您无法运行任何新程序 因此您甚至无法kill quit获取堆栈跟踪 这些 100 SYS CPU 负载持续
  • 在 Spring Boot WebSocket 中向特定用户发送通知

    我想向特定客户发送通知 例如用户名 user Configuration EnableWebSocketMessageBroker public class WebSocketConfiguration extends AbstractWe
  • 使用 IO monad 的 Haskell 单元测试

    我正在尝试为返回 IO monad 的 haskell 函数编写 HUnit 测试 因为它们执行文件 I O 有什么办法可以做到这一点吗 现在我正在尝试编写一个仅返回 Bool 的方法 这可以作为我的测试 combine FilePath
  • OSCAR_SEARCH_FACETS 用于过滤产品列表

    我正在使用 django oscar 开发一个电子商务网站 产品已列出 我必须应用过滤器 例如年份 价格等 我们可以使用 oscar facet 来实现此过滤功能吗 我尝试添加以下内容奥斯卡文档 http django oscar read
  • Django 带过滤器的左外连接

    我正在使用 Django 的内置用户模型 并有一个自定义 Foo 对象 其中包含 User 的外键 我希望选择符合某些约束的所有 User 对象和所有 Foo 对象 如下所示 SELECT from auth user LEFT OUTER
  • 如何理解 Haskell 中的“$”用法[重复]

    这个问题在这里已经有答案了 当您想要将一堆函数应用于同一个变量时 就会发生这种情况 它可能如下所示 map f gt f 4 odd even 但从LYAH http learnyouahaskell com higher order fu