我想尝试惰性表达式求值,但我现在不想深入研究 Haskel。请问您能帮忙看看还有哪些语言有这个功能吗?
您可以用多种语言来模拟它。例如,this 是 C++ 的通用惰性求值器。正如文章所述,它也受 .NET 语言支持(这就是本文试图模拟的)。
例如,C++ 表达式模板是惰性求值的其他形式。
Python 的生成器是惰性的。
任何数据流语言都是惰性的。
还有Lazy Racket。 Racket是Scheme的衍生品。
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) 你使用无限列表, (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]
请不要忘记清洁!(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 中更容易。而且效率很高。