- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在做一个学术练习(为了个人成长)。我想找到允许您定义能够接受自身(即指向自身的指针)作为参数的函数的编程语言。
例如,在 JavaScript 中:
function foo(x, y) {
if (y === 0) return;
x(x, y - 1);
}
foo(foo, 10);
let rec foo x y = if y < 1 then "hi" else x x (y - 1);;
Error: This expression has type 'a -> 'b -> 'c
but an expression was expected of type 'a
The type variable 'a occurs inside 'a -> 'b -> 'c
最佳答案
在任何具有可变性或递归性或两者兼有的语言中,都可以使用指向自身的指针调用函数。基本上,所有传统的图灵完备语言都具有这些功能,因此有很多答案。
真正的问题是如何键入这样的函数。 Non strongly typed语言(如 C/C++)或 dynamically (或 gradually )类型没有意义,因为它们启用某种形式的类型强制,这基本上使任务变得微不足道。他们依赖程序员提供一种类型并将其视为理所当然。因此,我们应该对具有静态类型系统的严格类型语言感兴趣。
如果我们将重点放在 OCaml 上,那么如果您通过 -rectypes
,编译器可能会接受您的定义。选项,将禁用出现检查,不允许递归类型。事实上,你的函数类型是 ('a -> int -> string as 'a) -> int -> string
,
# let foo x y = if y < 1 then "hi" else x x (y - 1);;
val foo : ('a -> int -> string as 'a) -> int -> string = <fun>
rec
在这里,因为您的函数并不是真正的递归。递归的是类型,
('a -> int -> string as 'a)
,这里
as
向左扩展到括号,即
'a = 'a -> int -> string
.这是一个循环,默认情况下,许多编译器不允许这样的方程(即,在方程两侧出现相同类型变量的方程,因此名称出现检查)。如果禁用此检查,编译器将允许此定义和类似定义。然而,据观察,发生检查捕获的错误多于不允许格式良好的程序。换句话说,当事件检查被触发时,它更有可能是一个错误,而不是故意尝试编写一个类型良好的函数。
let foo x y = if y < 1 then "hi" else x (y - 1)
val foo : (int -> string) -> int -> string = <fun>
(int -> string)
类型的另一个函数的函数。并返回
(int -> string)
类型的函数.因此,运行
foo
我们需要向它传递一个递归调用
foo
的函数,例如
let rec run y = foo run y
foo
当
foo
调用这个函数实际上是通过一个额外的引用调用它自己。我们可能还会注意到,将我们的函数包装在其他类型的值中(使用、记录或变体或对象)也将允许您进行定义。我们甚至可以将这些额外的辅助类型指定为
[@@unboxed]
这样编译器就不会在包装器周围引入额外的装箱。但这是一种欺骗。我们仍然不会将函数传递给自身,而是传递一个包含该函数的对象(即使编译器优化会删除这个额外的间接性,从类型系统的角度来看,它们仍然是不同的对象,因此发生检查是未触发)。所以,如果我们不想启用递归类型,我们仍然需要一些间接性。让我们坚持使用最简单的间接形式,
run
函数并尝试推广这种方法。
run
函数是更一般的
fixed-point combinator 的特例.我们可以参数化
run
具有
('a -> 'b) -> ('a -> 'b)
类型的任何函数,因此它不仅适用于
foo
:
let rec run foo y = foo (run foo) y
fix
,
let rec fix f n = f (fix f) n
val fix : (('a -> 'b) -> 'a -> 'b) -> 'a -> 'b = <fun>
foo
# fix foo 10
关于ocaml - 哪些编程语言支持将自身作为参数的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55789418/
有人尝试过两者J编程语言形式 jsoftware 和 R语言。经过一番搜索后,我遇到了 incanter这是基于 Clojure 的。我想学习一种用于数据分析的统计语言。你更倾向哪个?为什么? 请考虑
有谁知道我在哪里可以找到 NesC 编程语言的基础和高级教程和代码示例。 最好的问候 最佳答案 在这里您可以找到许多示例和许多其他文档。 http://docs.tinyos.net 关于NesC 编
我断断续续地玩 MUD 游戏已经一年多了。我在网上搜索了最好的计算机语言来学习开发我自己的语言。到目前为止,我除了 C 什么都没有想出。C 是学习此应用程序的最佳语言,还是有更好的语言? 我知道 SM
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 9 年前。 Improve this ques
我对编码有点陌生,可能不会使用正确的术语,希望我说的有道理。 我创建了一个类模块来构建对象。我的类模块当前有一些变量(我打算在构建代码时添加一些方法)。 'CLASS MODULE NAMED cls
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
问题:这个代码示例有什么问题,缺少什么? 当前不正确的输出是: “”中有0个字 代码说明:编写一个程序,读取一行文本,并打印出该行文本中的字数。单词包含字母数字字符。提示:使用 fgets() 函数。
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
任何人都可以回答如何在 GO 中获取系统时间来帮助我。例如,在下面的代码中,我想知道第一次打印和第二次打印语句何时执行,它们之间的时间差是多少。 package main import "fmt" f
Pyret 是一门基于 JavaScript 的脚本语言,旨在成为编程教育的绝佳选择,同时探索脚本语言和函数式编程的融合。目前 Pyret 正处于积极设计和开发阶段,开发者可以自由使用或对其进行修改
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 去年关闭。 Improve this
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 8年前关闭。 Improve this qu
在过去的几年里,我一直在做大量的 SIMD 编程,而且大部分时间我一直依靠编译器的内在函数(例如用于 SSE 编程的那些)或编程汇编来获得真正漂亮的东西。然而,到目前为止,我几乎找不到任何内置支持 S
当我尝试使用 watir-webdriver 步骤定义运行 Cucumber 场景时,出现以下错误: Failed to load 'yml' programming language for fil
Closed. This question does not meet Stack Overflow guidelines。它当前不接受答案。 想改善这个问题吗?更新问题,以便将其作为on-topic
关闭。这个问题需要更多focused .它目前不接受答案。 想改善这个问题吗?更新问题,使其仅关注一个问题 editing this post . 2年前关闭。 Improve this questi
我想知道是否有一种编程语言可以编译为机器代码/二进制(不是字节码,然后由 VM 执行,在考虑打字时这是完全不同的),具有动态和/或弱类型,例如: 想想一种编译语言,其中: 变量不需要声明 可以在运行时
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
我是一名优秀的程序员,十分优秀!