StandardML 中的 y 组合器

2024-03-08

我知道我可以用 SML 编写 y 组合器,如下所示: 首先声明一个新的数据类型来绕过由于循环而导致的类型不匹配。

datatype 'a mu = Roll of ('a mu -> 'a)
val unroll = fn Roll x => x

现在您可以轻松定义 y 组合器:

val Y = fn f => (fn x => fn a => f (unroll x x) a)
          (Roll (fn x => fn a => f (unroll x x) a)))

然后你就完成了,你可以像这样使用它:

val f = Y (fn f => fn n => if n = 0 then 1 else n * f (n-1))

我的问题是:是否有其他方法可以在 SML 中实现 y 组合器?


您当然可以使用内置递归本身,例如

fun Y f = f (fn x => Y f x)

or

fun Y f x = f (Y f) x

您还可以以与数据类型相同的方式使用异常,但只能单态:

exception Roll of exn -> int -> int
val unroll = fn Roll x => x
fun Y f = (fn x => fn a => f (unroll x x) a) (Roll (fn x => fn a => f (unroll x x) a))

但我相信参考文献已经涵盖了它。

编辑:实际上,您可以通过使用使其多态local例外:

fun Y f : 'a -> 'b =
  let
    exception Roll of exn -> 'a -> 'b
    val unroll = fn Roll x => x
  in
    (fn x => fn a => f (unroll x x) a) (Roll (fn x => fn a => f (unroll x x) a))
  end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

StandardML 中的 y 组合器 的相关文章

  • 将命令行参数传递给 SML 脚本

    如何将命令行参数传递给 SML 脚本 我知道有一个CommandLine arguments 正确类型的函数 unit gt string list 但像这样调用解释器 sml script name sml an argument ano
  • Scheme/Lisp 嵌套循环和递归

    我正在尝试解决方案中的一个问题 该问题要求我使用嵌套循环或嵌套递归 例如我有两个列表 我必须检查它们的笛卡尔积的条件 解决这些类型问题的最佳方法是什么 有关如何简化这些类型的函数的任何指示吗 I ll elaborate a bit sin
  • 为什么 x = x +1 在 Elixir 中有效?

    我读到的有关 Elixir 的所有内容都表明 赋值应该被视为模式匹配 如果是这样 为什么 x x 1 在 Elixir 中有效 不存在 x x 1 的 x 值 我读到的有关 Elixir 的所有内容都表明 赋值应该被视为模式匹配 在长生不老
  • number_in_month 练习(计算列表中的元素数)

    我一直在尝试使用 SML 对整数 3 元组列表中的元素进行计数 该列表等于给定的整数 但它不起作用 谁能帮我找出下面的代码有什么问题或者为我纠正它 fun number in month x int int int list m int i
  • 为什么要使用 Python 进行函数式编程?

    在工作中 我们过去常常以非常标准的面向对象方式来编写 Python 程序 最近 有几个人加入了功能性潮流 他们的代码现在包含更多的 lambda map 和reduce 我知道函数式语言有利于并发性 但是函数式 Python 编程真的有助于
  • python函数返回函数[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 C# 中实现记忆化 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我知道这个话题 记忆 已经被讨论了很多 比如here https stackoverflow com questions 285216
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

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

    只是为了让那些想要开始使用 Scala FP 库 在纯 FP 方面变得更好的人快速清晰地了解 有人能澄清猫和猫效应 猫效应 IO 之间的区别 关系吗 最重要的是 齐奥和莫尼克斯对此有何看法 最后 与 ScalaZ 7 8 有何关系 到目前为
  • 单位安全平方根

    我只是想知道如何以与 F 正确交互的方式编写用户定义的平方根函数 sqrt 单位制 http blogs msdn com andrewkennedy archive 2008 09 04 units of measure in f par
  • 为什么 Javascript 函数在实例化时的行为与执行时的行为不同?

    我来自 C PHP 并试图了解 Javascript 的想法 即函数是变量 对象并且具有准构造函数等 任何人都可以解释为什么以下代码会起作用 即 为什么实例化变量 函数时不显示 2 test 为什么执行变量 函数时不显示 1 test co
  • Haskell 对于 Web 应用程序来说足够成熟吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 函数式 Scala 中的选择排序

    我正在学习 Scala 编程 并编写了选择排序算法的快速实现 然而 由于我对函数式编程还不太了解 所以在转换为更 Scala 风格时遇到了困难 对于 Scala 程序员来说 如何使用 Lists 和 vals 来做到这一点 而不是回到我的命
  • 使用 Reader Monad 进行依赖注入

    我最近看到了谈话极其简单的依赖注入 http www youtube com watch v ZasXwtTRkio and 无需体操的依赖注入 http vimeo com 44502327关于 Monads 的 DI 并留下了深刻的印象
  • 如何在对象的多个方法上使用 functools.partial 并无序冻结参数?

    我发现 functools partial 非常有用 但我希望能够无序地冻结参数 您想要冻结的参数并不总是第一个 并且我希望能够将其应用于多个一次在类上使用方法 以创建一个代理对象 该对象具有与底层对象相同的方法 除了它的一些方法参数被冻结
  • 对列表中的相邻元素进行分组

    假设我想编写一个函数来执行此操作 输入 1 1 3 3 4 2 2 5 6 6 输出 1 1 3 3 4 2 2 5 6 6 它将相同的相邻元素分组 这个方法的名称应该是什么 此操作有标准名称吗 In 1 1 3 3 4 2 2 5 6 6
  • 返回带有参数的函数的函数

    创建一个应返回包含原始函数参数的函数时 我应该如何处理 例如考虑这个函数 a lt function value function x x value 我希望它返回我在结果函数的参数中指定的值 如下所示 b lt a 3 gt b gt f
  • 使用默认值压缩而不是删除值?

    我正在 haskell 中寻找一个函数来压缩两个长度可能不同的列表 我能找到的所有 zip 函数都只是删除列表中比其他列表长的所有值 例如 在我的练习中 我有两个示例列表 如果第一个比第二个短 我必须用 0 填充 否则我必须使用 1 我不允
  • 我可以在 Java 8 中使用 Clojure 函数作为 Lambda 函数吗?

    我在 Clojure 中使用了许多库来生成符合 Clojure lang IFN https github com clojure clojure blob master src jvm clojure lang IFn java 界面 它
  • Haskell 中的“修复”是什么?为什么“修复错误”会打印无限字符串?为什么“拿 10 美元修复错误”也有同样的作用?

    长话短说 我在看西蒙 佩顿 琼斯的演讲 https www youtube com watch v re96UgMk6GQ 并且当时21 41 https youtu be re96UgMk6GQ t 1301他引用了一句话 我正在解决一个

随机推荐

  • bootstrap:仅更改特定模态的模态背景不透明度

    我有一个包含多种模式的菜单 当我打开一个又一个时 背景会变成黑色 这很丑 我明白我需要改变filter alpha opacity 80 in modal backdrop fade in在 bootstrap css 中 但我需要更改它
  • 使用Collection接口创建ArrayList对象的多态性有什么好处?

    我研究了多态性并了解它可以进行动态方法绑定 如下所示 假设 Animal 类是抽象类 public class AnimalReference public static void main String args Animal ref s
  • 在 PHP 中,什么是二进制字符串(b'xxxx')?

    什么是b 二进制字符串 在 PHP 语句中的意思 str b xxxxxx The PHP 语言参考 http www php net manual en function is binary php描述unicode字符串和原生二进制字符
  • HashMap 不可序列化

    HashMap with Serializable键 值应该是Serializable 但这对我不起作用 尝试了其他一些IO流 没有一个有效 有什么建议吗 测试代码 public class SimpleSerializationTest
  • Modernizr.touch 在 Firefox 浏览器上返回 true

    我编写了一段代码来获取基于触摸和非触摸的事件 它适用于除 Firefox 之外的所有其他浏览器和设备 默认 FF 返回true var thumbsEvent isTouch Modernizr touch detect the touch
  • mysql中正则表达式匹配的十六进制字符

    我发现 mysql 的行为非常奇怪 下面的选择返回 0 SELECT CONVERT a USING BINARY REGEXP x61 然而 下面语义相同的 select 返回 1 SELECT CONVERT a USING BINAR
  • 仅在滚动时触发一次函数(scrollstop)

    所以 我只想在滚动时触发一次函数 使用滚动停止 https stackoverflow com questions 16867266 peform a function if an element is completely in the
  • 如何更改行结束设置

    是否有文件或菜单可以让我更改如何处理行结尾的设置 我读到有 3 个选项 Windows 风格的签出 Unix 风格的提交 Git 在签出文本文件时会将 LF 转换为 CRLF 什么时候 提交文本文件时 CRLF 将转换为 LF 为了 跨平台
  • Jquery:当输入值被另一个函数更改时,.on('input') 不会触发

    这是代码 input type text on input function stuff here first function input type text click function second function keyboard
  • Rhino - 模拟类而不覆盖虚拟方法

    如果我正在模拟一个类 如下所示 有什么方法可以让模拟not重写虚拟方法 我知道我可以简单地删除 virtual 修饰符 但我实际上想稍后删除此方法的行为 换句话说 除了删除 virtual 修饰符之外 如何才能通过此测试 namespace
  • 递归查找子集

    这是我尝试创建的一个递归函数 用于查找 STL 集中传递的所有子集 这两个参数是一个用于搜索主题的 STL 集 以及一个数字 i gt 0 它指定子集应该有多大 如果整数大于集合 则返回空子集 我认为我这样做不正确 有时是对的 有时则不是
  • 在 Erlang 中如何将元组对列表转换为记录?

    假设我有这个 record my record foo bar baz Keyvalpairs foo val1 bar val2 baz val3 Foorecord my record foo val1 bar val2 baz val
  • SimpleDateFormat 错误地解析字符串

    String s 19 17 38 008000 DateFormat f new SimpleDateFormat HH mm ss SSSSSS Date d f parse s system out println d 这是我正在运行
  • 有没有办法在 Windows 上使用 Qt 列出当前进程?

    使用 Qt 4 是否可以知道哪些进程正在运行 我正在寻找一种方法来等待用户关闭应用程序才能进行操作 我也不知道 Qt 解决方案 但使用CreateToolhelp32Snapshot Process32FirstW and Process3
  • 在后台任务中添加到 CALayer 时 UIImage 不显示

    在我的视图控制器中我有 IBOutlet var worldmapview Worldmapview var eventLayer CALayer CALayer 和一些功能 func create picture layer pathto
  • SVN 标签:如何不更新/签出它们?

    在许多项目中 我查看完整的存储库并获得标准目录结构 project branches tags trunk 如果我做一个svn up project 一切都很好branches and trunk文件夹 但是 当然 tags文件夹也更新了
  • 我无法将 postgresql schema.table 与 dplyr 包连接

    我正在尝试将 postgres 与 dplyr 函数连接 my db lt src postgres dbname mdb1252 user diego password pass my db src postgres 9 2 5 post
  • 带日期轴的箭袋或倒钩

    绘制箭袋或倒刺的时间序列 日期 的标准方法是什么 我经常在 Pandas DataFrame 中有时间序列 并像这样绘制它们 plt plot df index to pydatetime df parameter 这非常有效 x 轴可以被
  • 使用@font-face 使用多种自定义字体?

    我确信我错过了一些非常直接的东西 一直使用带有普通字体的单个自定义字体 font face font family CustomFont src url CustomFont ttf 当我使用它时一切正常 但如果我想添加另一种自定义字体我该
  • StandardML 中的 y 组合器

    我知道我可以用 SML 编写 y 组合器 如下所示 首先声明一个新的数据类型来绕过由于循环而导致的类型不匹配 datatype a mu Roll of a mu gt a val unroll fn Roll x gt x 现在您可以轻松