有趣的问题。我认为您应该以某种方式使用惰性评估。我不知道如何使用它,因为我从来没有这样做过,我不得不承认我并没有真正深入研究它,但在短暂的“谷歌搜索”之后,我想我可以提供一些有用的链接。
所以,我的第一个猜测是:
fun pairFirst f1 f2 i1 =
fn () => pairFirst f2 f1 (f1 i1)
正如你在 LISP 中所做的那样,但它显然在 SML 中不起作用。所以我用谷歌搜索了它。
首先,我发现 SML 确实支持惰性求值:
http ://www.cs.cmu.edu/~rwh/introsml/core/lazydata.htm
引用:“首先,必须通过评估以下声明来启用 SML/NJ 的惰性评估机制:
Compiler.Control.Lazy.enabled := true;
open Lazy;
"
我试过了,但也没有用,所以我用谷歌搜索了更多:
https ://github.com/trptcolin/euler-sml/blob/master/lazy_utils.sml
引用:“(* 最懒惰的细节来自标准 ML 编程,Robert Harper * 值得注意的例外:Compiler.Control.Lazy.enabled 已移至 Control.lazysml *)
Control.lazysml := true;
open Lazy;
"
从这两个链接的内容,我构建了我的第二个猜测:
Control.lazysml := true;
open Lazy;
fun lazy pair (f1: 'a -> 'a, f2: 'a -> 'a, i1: 'a) : 'a susp =
pair (f2, f1, (f1 i1))
SML 以某种方式“吞下”了它:
- [opening /home/spela/test.sml]
val it = () : unit
opening Lazy
datatype 'a susp = $ of 'a
val pair = fn : ('a -> 'a) * ('a -> 'a) * 'a -> 'a susp
val pair_ = fn : ('a -> 'a) * ('a -> 'a) * 'a -> 'a
val it = () : unit
它有效吗?我不知道 :)
- pair ((fn x => x + 1), (fn y => y - 1), 1);
val it = $$ : int susp
我没有阅读这些链接,但我还找到了一篇我也没有阅读的文章,但我相信它提供了您正在寻找的答案:
http://www.cs.mcgill.ca/~bpientka/courses/cs302-fall10/handouts/lazy-hof.pdf
我相信这些链接可以回答您的问题。
如果有人熟悉这个话题,请回答这个问题,我认为这对我们许多人来说会很有趣。
最好的问候,斯佩拉