在 Haskell 中柯里化 3 个参数

2023-12-26

我在柯里化函数以删除 Haskell 中的三个参数时遇到问题。

免责声明:不是课程作业,今天有人问我这个问题,这个问题一直困扰着我。

我们得到的自定义类型/函数是(只能记住类型)

type MyThing
  = (Char, String)
type MyThings
  = [MyThing]

funcA :: MyThings -> String -> String
funcB :: MyThings -> String -> Int -> String

我们从以下开始:

funcB as str n = iterate (funcA as) str !! n

并将其减少如下:

funcB as str n = iterate (funcA as) str !! n
funcB as str = (!!) . (iterate (funcA as)) str
funcB as = (!!) . (iterate (funcA as))
funcB as = (!!) . (iterate . funcA) as

然后,卡住了。我们只是不知道如何避免使用最后一个参数。我知道我以前在某个地方见过类似的情况并且有解决方案。

希望一些哈斯克尔天才能够指出为什么我是个白痴......


这里您所需要的只是运算符部分的以下三个“定律”:

(a `op` b) = (a `op`) b = (`op` b) a = op a b
          (1)          (2)          (3)

以便操作数进入运算符附近的空闲槽。

For (.)这意味着:(a . b) = (a .) b = (. b) a = (.) a b. So,

f (g x) y !! n      
= (!!) (f (g x) y) n              by (3) 
= ((!!) . f (g x)) y n
= ((!!) . (f . g) x) y n
= ((!!) .) ((f . g) x) y n        by (1)
= (((!!) .) . (f . g)) x y n
= (((!!) .) . f . g) x y n

您应该只进行您认为合适的无点转换,以便生成的表达式仍然可读for you- 事实上,clearer比原来的。 “pointfree”工具有时会产生不可读的结果。

中途停下来是完全可以的。如果您手动完成它太困难,那么您阅读它可能也会很困难。

((a .) . b) x y = (a .) (b x) y = (a . b x) y = a (b x y) is a 共同模式您将很快学会立即识别。所以上面的表达式可以很容易地读回为

(!!) ((f . g) x y) n = f (g x) y !! n

考虑到(.)是结合的:

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

在 Haskell 中柯里化 3 个参数 的相关文章

随机推荐

  • 如何使用 maven-scala 插件解决依赖项的“错误:错误的符号引用”?

    我正在使用 Scala 和 Slick 构建一个小型数据库查询实用程序 并使用 Maven 作为构建和打包工具 我的代码编译时没有任何语法错误 但构建失败并出现以下错误 INFO maven scala plugin 2 15 0 comp
  • 如何发送和接收广播消息

    我正在尝试在选项卡内的两个活动之间传递数据 我正在尝试使用sendBroadcast 设置断点后我永远不会到达onReceive 显现
  • JavaScript 错误 - 无法调用 null 的方法“appendChild”

    我是 Javascript 以及一般编程 的新手 一直在尝试基本掌握 DOM 的使用 如果这是一个非常基本的错误 我深表歉意 但我环顾四周 找不到答案 我正在尝试使用appendChild方法将标题和一些段落文本添加到下面非常基本的HTML
  • java.lang.IllegalArgumentException:观察者为空

    我的一个应用程序的用户报告了此错误 我对这意味着什么以及如何解决它感到困惑 经过一番谷歌搜索后 仍然没有运气 有人以前见过这个或者知道如何解决它吗 java lang IllegalArgumentException The observe
  • VS 2019 的终端在哪里?

    我正在运行 16 3 4 所以我认为它应该已经包含早期预览版本的更新 这里提到 https devblogs microsoft com visualstudio say hello to the new visual studio ter
  • xreadlines 和 for 循环文件之间的区别

    在 Python 2 7 中有一个文件对象 f open my file r for 循环文件 最常见的方式 和使用xreadlines 功能 for line in f Do something with line and for lin
  • OpenMP:将所有线程分为不同的组

    我想将所有线程分为 2 个不同的组 因为我有两个并行任务要异步运行 例如 如果总共有 8 个线程可用 我希望有 6 个线程专用于任务 1 另外 2 个线程专用于任务 2 如何使用 OpenMP 实现这一目标 这是一份工作OpenMP 嵌套并
  • 使用 Groovy 脚本访问当前 Jenkins 构建

    我创建了一个 Groovy 脚本 用于System Groovy ScriptJenkins 作业中需要访问当前作业的当前版本的步骤 使用 Hudson model 时需要当前版本Cause UpstreamCause将我当前作业的当前版本
  • Windows 10 1703 升级后 Windows Mobile 设备中心停止工作

    我刚刚安装了新的 Windows 10 版本 1703 现在我无法连接任何 Windows CE 设备 因为 Windows Mobile 设备中心 6 1 无法运行 https i stack imgur com 1TRsz png我尝试
  • REST API 和供应商特定内容类型的版本控制

    我读了很多关于 REST API 版本控制的内容 例如在这个线程中 API 版本控制的最佳实践 https stackoverflow com questions 389169 best practices for api versioni
  • Kotlin:通过强制转换修改(不可变)列表,合法吗?

    我们知道 Kotlin 中的列表是不可变的 即您不能像下面那样添加和删除 class TempClass var myList List
  • Vagrant 和 Docker 与微服务

    我有一组微服务 我希望使用 Docker 对其部署进行自动化和标准化 我一直在阅读有关 Vagrant 的内容 并且对使用 Vagrant 设置环境有几个问题 据我所知 Vagrant 用于设置虚拟机 而 Docker 用于创建容器 在虚拟
  • Paypal 付款数据传输 (PDT) 错误 4002

    我正在努力将我的网站与贝宝集成并使其在沙盒模式下工作 我正在 Codeigniter PHP 工作 我已经收到 IPN 通知 工作正常 但似乎无法弄清楚 PDT 出了什么问题 需要它显示正确的确认页面并返回 我已经多次检查身份令牌 确保 h
  • 为什么我突然收到这个错误?

    所以我有一个 WCF 服务 其中有一个 Process 方法 此方法从一个表中读取一个字节数组 一个文件 然后基本上将该文件中的数据放入多个表中 它只是迭代每一行 在生产环境一个月以来 它运行良好 现在突然间 它间歇性地抛出这个错误 Sys
  • 如何从 Flutter 应用程序在 google chromecast 中播放 YouTube 视频?

    我的 Flutter 应用程序有一些 YouTube 视频链接 那些 YouTube 链接 我想通过 google chromecast 进行流式传输 我已经看到一些使用下面的颤振库进行视频流投射 https pub dev package
  • 如何使用 dplyr 重新编码(和反向编码)列中的变量

    继 2013 年最后一次使用 R 之后 我再次拿起 R 我已经习惯使用 dplyr 但我在执行一个简单任务时遇到了问题 我有一张桌子 看起来像 Participant Q1 Q2 Q3 Q4 Q5 1 agree neutral NA Di
  • Laravel 关系集合的自定义排序

    我有点被一些通常很简单的事情所困扰 我需要根据某个值和 排序顺序 数组将 hasMany 关系中的记录排序为自定义顺序 我下面的代码不起作用 因为我正在向 uSort 传递一个雄辩的集合 并且我不知道如何绕过它 go this gt has
  • +- Scala 中通用声明中的符号

    我正在查看 PartialFunction 的文档这个链接 http www scala lang org api current index html scala PartialFunction trait PartialFunction
  • DOM 处理后 XML 属性的顺序

    当通过标准 DOM 处理 XML 时 序列化回来后不能保证属性顺序 最后 这就是我在使用标准 java XML Transform API 序列化输出时刚刚意识到的 但我确实需要保留订单 我想知道 Java 是否有可能保持通过 DOM AP
  • 在 Haskell 中柯里化 3 个参数

    我在柯里化函数以删除 Haskell 中的三个参数时遇到问题 免责声明 不是课程作业 今天有人问我这个问题 这个问题一直困扰着我 我们得到的自定义类型 函数是 只能记住类型 type MyThing Char String type MyT