哪些编程语言支持惰性求值?

问题描述 投票:0回答:4

我想尝试惰性表达式求值,但我现在不想深入研究 Haskel。请问您能帮忙看看还有哪些语言有这个功能吗?

lazy-evaluation
4个回答
4
投票

您可以用多种语言来模拟它。例如,this 是 C++ 的通用惰性求值器。正如文章所述,它也受 .NET 语言支持(这就是本文试图模拟的)。
例如,C++ 表达式模板是惰性求值的其他形式。


4
投票

Python 的生成器是惰性的。

任何数据流语言都是惰性的。

还有Lazy Racket。 Racket是Scheme的衍生品。

SWI Prolog 有

freeze
谓词,它会暂停对逻辑变量的评估,直到需要它为止,从而使例如这个:

fibs(X):- X = [0,1|Z], genfibs(X, Z).

genfibs([A|Y], Z):- Y = [B|Z], freeze(Z, (C is A+B, Z = [C|W], genfibs(Y, W))).

测试:

13 ?- fibs(X)、长度(A,15)、追加(A,_,X)、writeln(A)。
[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377]
冻结(_G2517,(_G2582 是 233+377,_G2517=[_G2582|_G2595],genfibs([377|_G2517],_G2595)))。

这是 Haskell 的翻译

fibs = x where x = 0 : 1 : (gen x)
               gen (a: y@(b:_)) = (a+b) : (gen y)

1
投票

惰性求值在两种情况下很有用: (1) 你使用无限列表, (2) 您需要回答之前问题。

这在函数式编程中很正常(例如:Gofer/Miranda/Haskell)。

无限列表可以被视为流(如键盘输入、随机数、广播音乐……)

示例: (a) 自然数:[1..] (b) 斐波那契数列: fibs = 0:1: zipwith (+) fibs (tl fibs)

如果你想得到20个随机数,你可以将其表达为: 随机抽取20个

在“正常”(命令式)编码风格中,用户对话框的形式为: ...->(输入->输出)->(输入->输出)->...

在函数式编程(FP)中,视图改为: ...->输入)->(输出->输入)->(输出->...

这只能使用惰性评估来实现。

如果您运行的是 Linux,则可以从 miranda.org.uk 编译并运行 Miranda。米兰达是商业化的。它比 Haskell 容易得多。

foldr1 (+) [1..36]


0
投票

请不要忘记清洁!(https://wiki.clean.cs.ru.nl/Clean)。本质上与 Haskell 类似(惰性、类型推断、语法的重要组成部分)。大量的互换性,请参见, https://www.mbsd.cs.ru.nl/publications/papers/2010/groj10-Haskell_front_end_Clean.pdf

类型系统有点不同,可能不如 Haskell 复杂(类型类系统“更扁平”,没有 monad [除非用户实现],但“唯一类型”以可读且高效的方式取代 monad。)

这是一门很好、有用的语言,应该被更好地了解和教授。在我看来:对于数值工作来说,处理复杂的算法比在 Haskell 中更容易。而且效率很高。

© www.soinside.com 2019 - 2024. All rights reserved.