gpt4 book ai didi

haskell - 每种函数式语言都可以偷懒吗?

转载 作者:行者123 更新时间:2023-12-04 10:36:15 24 4
gpt4 key购买 nike

在函数式语言中,函数是一等公民,因此调用它们并不是我唯一能做的事情。我也可以把它们收起来。

现在,当我拥有一种默认严格的语言时,我仍然不会被迫评估函数调用。我可以选择存储函数及其参数,例如在一个元组中供以后评估。

所以而不是

x = f a b c

我做类似的事情
x = (f,a,b,c)

后来,我可以用类似的东西来评估这个东西
eval (f,a,b,c) = f a b c

好吧,可能还有更多,因为我只想评估每个未评估的函数调用一次,但在我看来,这也可以用比元组更花哨的数据结构来解决。

反过来似乎也是如此,因为例如在 Haskell 中,默认是惰性的,我可以使用 seq 强制执行评估或 BangPatterns .

所以说每个函数式语言都有可能变得懒惰是否正确,但它们中的大多数默认情况下并不懒惰,因此需要额外的编程工作才能懒惰地调用函数,而 Haskell 默认情况下是懒惰的,需要额外的编程努力以严格的方式调用函数?

如果是这样,对程序员来说更难的是:用严格的语言编写惰性函数调用还是用惰性语言编写严格的函数调用?

作为旁注:Simon P. Jone 说“下一个版本的 haskell 将是严格的”时是否认真。我一开始以为这是个玩笑。但是现在我认为默认情况下严格并不是那么糟糕,只要您可以在需要时变得懒惰。

最佳答案

低级别的惰性求值是由一个称为 的概念实现的。重击 ,其中包括两件事:

  • 计算延迟计算值的闭包
  • 一个设置一次的可变存储单元,用于内存结果。

  • 第一部分,闭包,可以用比使用函数及其参数的元组更简单的方式建模。您可以只使用接受单位或不接受参数的函数(取决于您的语言的工作方式),并在其主体中将函数应用于参数。要计算结果,您只需调用该函数。

    Paul Johnson 提到了 Scheme,这是一种完美的语言来证明这一点。作为一个 Scheme 宏(伪代码,未经测试):
    (define-syntax delay
    (syntax-rules ()
    ((delay expr ...)
    ;; `(delay expr)` evaluates to a lambda that closes over
    ;; two variables—one to store the result, one to record
    ;; whether the thunk has been forced.
    (let ((value #f)
    (done? #f))
    (lambda ()
    (unless done?
    (set! value (begin expr ...))
    (set! done? #t))
    value)))))

    (define (force thunk)
    ;; Thunks are procedures, so to force them you just invoke them.
    (thunk))

    但是回到问题的标题:这是否意味着每种函数式语言都可以是惰性的?答案是 没有 . Eager 语言可以实现 thunking 并使用它在用户选择的位置提供选择性延迟评估,但这与 Haskell 实现提供的普遍惰性评估不同。

    关于haskell - 每种函数式语言都可以偷懒吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33766559/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com