haskell 的foldr 总是采用两个参数的lambda 吗?

2024-04-19

Haskell 新手在这里

我正在用 haskell 解决这个问题:

(**) Eliminate consecutive duplicates of list elements.
If a list contains repeated elements they should be replaced with a single copy of the element. The order of the elements should not be changed.

Example:
* (compress '(a a a a b c c a a d e e e e))
(A B C A D E)

解决方案(我必须查找)用户文件夹:

compress' :: (Eq a) => [a] -> [a]
compress' xs = foldr (\x acc -> if x == (head acc) then acc else x:acc) [last xs] xs

根据解决方案,这个foldr需要两个参数,x和acc。似乎所有的foldr 都采用这些参数;这有什么例外吗?就像一个需要 3 个或更多的文件夹?如果不是,这个约定是否多余?可以用更少的代码编写公式吗?


foldr接受 2 个参数的函数,但这并不妨碍它接受 3 个参数的函数,前提是该函数具有正确的类型签名。

如果我们有一个函数

g :: x -> y -> z -> w

With

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

我们想要经过的地方g to foldr, then (a -> b -> b) ~ (x -> y -> z -> w) (where ~是类型相等)。自从->是右结合的,这意味着我们可以写g的签名为

x -> y -> (z -> w)

其意义是一样的。现在我们已经生成了一个具有两个参数的函数,该函数返回一个具有一个参数的函数。为了将其与类型统一a -> b -> b,我们只需要把参数排列起来:

a ->   |  x ->
b ->   |  y -> 
b      |  (z -> w)

这意味着b ~ z -> w, so y ~ b ~ z -> w and a ~ x so g的类型确实必须是

g :: x -> (z -> w) -> (z -> w)

implying

foldr g :: (z -> w) -> [x] -> (z -> w)

这当然不是不可能的,尽管可能性更大。我们的累加器是一个函数,对我来说,这需要用 DiffList 来演示:

type DiffList a = [a] -> [a]

append :: a -> DiffList a -> DiffList a
append x dl = \xs -> dl xs ++ [x]

reverse' :: [a] -> [a]
reverse' xs = foldr append (const []) xs $ []

注意foldr append (const []) xs返回我们应用的函数[]反转列表。在本例中,我们为该类型的函数指定了一个别名[a] -> [a] called DiffList,但这实际上与写的没有什么不同

append :: a -> ([a] -> [a]) -> [a] -> [a]

这是一个有 3 个参数的函数。

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

haskell 的foldr 总是采用两个参数的lambda 吗? 的相关文章

  • 运营商部分应用

    如果我想在字符末尾添加一个空格以返回列表 如果我不传递任何参数 我将如何通过部分应用程序来完成此操作 还有类型是 space Char gt Char 由于使用 和 运算符出现 解析错误 我在末尾添加空格时遇到问题 到目前为止我所拥有的是
  • 如何根据列表中的先前值过滤Haskell中的列表元素?

    我正在努力在 Haskell 中创建一个函数 该函数根据列表中前一个元素的条件过滤列表的数字 Example 前一个数字是 2 的倍数 myFunction 1 2 5 6 3 expected output 5 3 我知道如何申请filt
  • 使用 Template Haskell 生成函数

    是否可以使用 Template Haskell 定义函数 例如 convertStringToValue String gt Int convertStringToValue three 3 convertStringToValue fou
  • 在 Haskell/Yampa 和 HOOD 中调试游戏对象的输出

    我一直坚持使用 Haskell Yampa Arrows with HOOD 为我的游戏对象生成调试输出 我的引擎基本上运行一系列游戏对象 这些对象产生输出状态 线 圆 然后进行渲染 data Output Circle Position2
  • unsafeInterleaveIO 什么时候不安全?

    与其他不安全 操作不同 文档 http hackage haskell org packages archive base latest doc html System IO Unsafe html v unsafeInterleaveIO
  • 移动列表中特定元素的简单函数

    我是 Haskell 的新手 我正在尝试弄清楚如何创建一个函数 shift Eq a gt a gt a gt Int gt a shift x h t z 输入 一个通用列表和一个相同类型的元素 x 前提条件 元素x存在于列表中 Outp
  • 在 Haskell 中提升 State monad 中的值

    我正在 Haskell 中编写一个数独生成器 求解器作为学习练习 My solve函数接受一个UArray但返回一个State Int UArray 这样它也可以返回解决问题时发现的最大难度级别 到目前为止 这是我的功能 仍处于实验性的早期
  • 让 GHC 生成“带进位加法 (ADC)”指令

    下面的代码将表示 192 位数字的两个未装箱字三元组添加到新的未装箱字三元组中 并且还返回任何溢出 LANGUAGE MagicHash LANGUAGE UnboxedTuples import GHC Prim plusWord2 Wo
  • 在 Haskell 中将字节转换为 Int64s/Floats/Doubles

    我正在尝试解析 Haskell 中的二进制文件格式 Apple 的二进制属性列表格式 该格式所需的内容之一是将字节序列视为 a 无符号 1 2 或 4 字节整数 b 有符号 8 字节整数 c 32 位floats d 64 位doubles
  • 通过 Emacs 评估 ghci 或 Hugs 中的缓冲区

    在 Emacs 中使用 sml mode 我已经能够使用以下命令将缓冲区内容直接发送到较差的 SML 进程C c C b 现在我只想用 Haskell 做同样的事情 Haskell 模式似乎不支持这一点 所以我想知道 使用 Emacs 和
  • 如何在 Yesod 中使用 CSS 框架?

    我想将 Blueprint CSS 框架与 Yesod 一起使用 有没有最佳实践 因为 Yesod 使用 CSS 模板 所以在我看来我不能直接使用 css 文件 我必须将它们重命名为 lucius files 吗 如何将 CSS 添加到 d
  • Haskell,optparse-generic 的未命名命令行参数

    我在用着optparse 通用 https hackage haskell org package optparse generic解析名为的程序的命令行参数example 我有一个带有命名字段的数据类型 记录语法 例如 data Exam
  • 将系统命令的结果绑定到 Haskell 中的变量

    如何在 Haskell 中运行系统命令and将其结果 即标准输出 绑定到变量 在伪 Haskell 中 我正在寻找类似以下内容的内容 import System Process main do output lt callCommand e
  • 访问函数中的环境

    In main我可以读取我的配置文件 并将其提供为runReader somefunc myEnv正好 但somefunc不需要访问myEnv读者提供 链中的下一对也没有提供 需要 myEnv 中某些内容的函数是一个微小的叶函数 如何在不将
  • 使用 nix 在 Mac OS X 上由于“架构 x86_64 的未定义符号”而导致“堆栈构建”失败

    首先是错误消息 stack build Linking Users yuzhao stack setup exe cache x86 64 osx tmp Cabal simple mPHDZzAJ 2 2 0 1 ghc 8 4 4 cl
  • 为什么 Haskell 的默认字符串实现是一个字符链接列表?

    Haskell 默认值的事实String众所周知 实现在速度和内存方面都效率不高 据我所知 lists一般来说 在 Haskell 中实现为单链表 并且适用于大多数小型 简单数据类型 例如Int 这似乎不是一个好主意 但是对于String这
  • Haskell scala 互操作性

    我是 Scala 初学者 来自面向对象范式 在了解 Scala 的函数式编程部分时 我被引导到 Haskell 纯函数式编程语言 探索 SO 问题答案 我发现 Java Haskell 具有互操作性 我很想知道 Scala Haskell
  • Haskell 中的 print 是纯函数吗?

    Is print在 Haskell 中是纯函数 为什么或者为什么不 我认为不是 因为它并不总是返回与纯函数应返回的值相同的值 类型的值IO Int并不是真正的Int 它更像是一张纸 上面写着 嘿 Haskell 运行时 请生成一个Int如此
  • Haskell:是的,没有类型类。为什么是整数?

    我有一个关于 GHCi 如何假定整数类型的问题 我正在阅读 Learn you a Haskell 是 否类型的课程 如果您想阅读全文 这里有一个链接 http learnyouahaskell com making our own typ
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov

随机推荐

  • 如何将空白复选框作为 false 传递给参数

    我有一个更新用户表单的表单 其中几个元素是复选框 我希望 true 传递给参数 如果选中 这是工作 false 传递给参数 如果未选中 不工作 未经检查的项目甚至没有发送到参数 如何使未检查的项目作为错误通过 Form h4 Please
  • Junit 异常测试用例 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 public class TipException extends Exception private final Object mSour
  • Python ARIMA模型,预测值发生偏移

    我是 Python ARIMA 实现的新手 我有几个月 15 分钟一次的数据 我尝试遵循 Box Jenkins 方法来拟合时间序列模型 我在最后遇到了一个问题 这ACF PACF图 https i stack imgur com weNJ
  • Haskell 中自动函数约束推导的类型约束

    出于教育目的 我在 Haskell 中摆弄树木 我有Tree a像这样定义的类型 data Tree a EmptyTree Node a Tree a Tree a 以及许多共享基本约束的函数 Ord a 所以他们有这样的类型 treeI
  • 无法点击 iframe 内的按钮

    设想 Launch http www indiabookstore net http www indiabookstore net 点击FB 类似按钮它位于 iframe 内 向下滚动即可看到 Issue 我可以切换到 iframe 但无法
  • Android 上的图像处理 - 我可以使用哪些库?

    我专门需要它来处理图像失真 滤镜 模糊等 也欢迎 你知道一些我可以使用的具有适当许可证的库 还有 Apache MIT LGPL 吗 价格合理的专有图书馆 也向他们开放 也可以用C语言 提前致谢 达内尔 您可能想查看OpenCV http
  • 我的 Web API 序列化出现错误

    我有一个带有多个返回不同结果的控制器的 WebApi 例如 一个控制器返回了IEnumerable
  • ImportError:LinuxMint17.3 中“没有名为plotly.plotly 的模块”

    每当我尝试编译以下代码以获得折线图时 都会显示一些错误 但我不知道如何解决它 这是我的code https plot ly python line charts import plotly plotly as py import plotl
  • Apple 推送通知 (APN) 不一致?

    通过 APN 使用 Apple 的推送通知时 我们遇到了一个令人困惑的问题 我们有以下场景 我猜是相当标准的 当我们的应用程序 我们在这里称之为 MyApp 首次安装并启动时 我们会请求用户授予通过 MyApp 向他发送推送通知的权限 在此
  • 是否有 java.util.Properties 类的 C# 类似物

    Java 有一个 Properties 类 非常适合保存基本配置信息 例如您希望从一个会话持续到下一个会话的 GUI 设置 我记得它保存和检索键值对 并且使用起来非常简单 我一直在 C 中寻找类似的东西 但没有成功 我错过了吗 如果没有 除
  • 防止 NE 用于 lm 回归

    我有一个包含未来收益的向量 Y 和一个包含当前收益的向量 X 最后一个 Y 元素是 NA 因为最后一个电流返回也是可用系列的最后一个 X 0 1 0 3 0 2 0 5 Y 0 3 0 2 0 5 NA Other 5500 222 523
  • Osmnx python graph_to_gdfs 有时会在名称列中返回一个列表,是什么原因造成的?

    我正在使用 OSmnx 创建一些漂亮的地图 其中我根据街道名称为街道着色 灵感来自 puntofisso 例如 如果是街道 则需要是红色 车道是绿色等 我注意到有时边的名称不是字符串 而是列表 到目前为止我已经解决了这个问题 但是有一个论点
  • @Cache注解使用错误

    我添加了以下注释以启用对我的 EJB3 实体之一的缓存 以使用 ehCache 测试缓存 其中我使用 Hibernate 作为持久性提供程序 import org hibernate annotations Cache import org
  • 模块 PIL 没有属性“重新采样”

    我之前运行过相同的代码 带有我需要的包 并且它有效 不确定现在发生了什么 这显示错误 AttributeError module PIL Image has no attribute Resampling 可能这是一个小问题 但我无法弄清楚
  • 如何按顺序检查一个列表是否是另一个列表的子序列[重复]

    这个问题在这里已经有答案了 我有一个清单input 1 2 4 3 5 7 5 3 8 3 8 5 8 5 9 5 7 5 7 4 9 7 5 7 4 7 4 7 8 9 7 5 7 5 4 9 3 4 8 4 8 5 3 5 4 7 3
  • datatype.text 验证什么?

    我有一个生产应用程序正在接受我们的安全扫描CWE 100 https cwe mitre org data definitions 100 html 我知道这是一个已弃用的项目 但它仍然显示在我的报告中 目前我只看到要采取两个行动 处理好每
  • ReplayKit 初始警报选择的委托方法是什么?

    当用户第一次决定使用 ReplayKit 时 会出现一条警报 它给出了 3 个选择 Record Screen and Microphone Record Screen Only Don t Allow 有哪些委托方法可以帮助我找出用户选择
  • 将零填充到二进制数中特定位置的命令?

    我需要将零填充到二进制数的特定位置 循环二进制数的数组形式 例如dec2bin 43 添加零并调整大小听起来像是轮子的重新发明 如何在Matlab中有效地将零填充到二进制数 Looping positions 1 3 6 x de2bi 4
  • 使用大括号括起来的初始值设定项列表初始化结构向量

    我像这样初始化普通类型向量 vector
  • haskell 的foldr 总是采用两个参数的lambda 吗?

    Haskell 新手在这里 我正在用 haskell 解决这个问题 Eliminate consecutive duplicates of list elements If a list contains repeated elements