【问题标题】:Why does Haskell have non-strict functions (semantics)? [closed]为什么 Haskell 有非严格的函数(语义)? [关闭]
【发布时间】:2013-01-10 15:47:54
【问题描述】:

根据denotational semantics in haskell上的这篇文章 所有类型都有底,一个函数 f:A->B 是 strict 如果它将 A 类型的底映射到 B 类型的底,则称为 non-strict 否则。

(这让人联想到态射保留基点的尖类)。

为什么 Haskell 有非严格函数,而标准 ML 没有?

【问题讨论】:

  • 你是在问为什么懒惰是 Haskell 的一部分,或者为什么它是一般编程语言的一部分?
  • 如果您特别询问 Haskell,它具有非严格功能,因为其他语言具有它们。 Haskell 的创建是为了统一现存惰性语言的特性。请参阅research.microsoft.com/en-us/um/people/simonpj/papers/… 的第 2.1 节。
  • @heatsink:一般是编程语言。我已经收集到非严格与懒惰有关,但不明白为什么。
  • 我不认为“为什么 X 有 Y”或“为什么 X 没有 Y”对于这个网站来说是个好问题。为什么Java要以一个岛命名,为什么go语言团队觉得不需要异常,firefox不是多进程浏览器有什么问题?这些实际上不是 stackoverflow 应该涵盖的编程问题。
  • foldl 和 foldr 非常适合您提出问题。 “foldleft 可以根据 foldright 定义,但反之则不行,因为 foldleft 在列表参数的尾部是严格的,但 foldright 不是(即 fold_left 作用在底部给出底部)”

标签: haskell functional-programming computer-science category-theory


【解决方案1】:

每一种具有递归的编程语言至少有一个非严格函数,通常以条件的形式 (if-then-else)。否则,所有递归都将表示底部(非终止)。然而,与非严格函数一样,这些语言中的大多数都不允许您定义自己的函数!一些语言通过提供宏来弥补这一限制——这是一种类似于函数的机​​制,可以转换语法而不是值。

【讨论】:

    【解决方案2】:

    为什么 Haskell 有非严格函数,而标准 ML 没有?

    Haskell 有非严格的函数——通常是惰性函数——因为它们是一个有用的编程特性。

    它们改进了等式推理,使编写代码变得更容易,并使编写更多种类的程序成为可能。

    【讨论】:

    • 我同意惰性函数很有用。但是问题中定义的严格性如何允许这样做?
    • 您的问题需要澄清——您是在问为什么严格将参数中的底值映射到结果的底值? (即,将 undefined 作为参数传递给函数会导致 undefined 成为严格函数)。
    • 这里的“严格”一词可能用于多个概念。在指称语义中,它完全等同于保留底部。而我认为您使用“严格”来指代非惰性函数。我会更改问题以反映这一点。
    • 啊,我明白了。惰性是实现非严格语义的一种方式。
    【解决方案3】:

    Simon Peyton-Jones 在他的幻灯片集Wearing the Hair Shirt 中对此给出了一些很好的回应。

    懒惰很方便

    递归值非常有用

    懒惰让你诚实[关于纯洁]

    最后一个原因对我来说是最重要的。 Haskell 的计算纯度和对效果的严格控制在很大程度上归功于它的非严格性。

    每一种按值调用的语言都接受了副作用的警笛声

    程序员想要编写类似 C 的代码,我认为这是在大多数语言中引诱的“警笛声”。在 Haskell 中,随意交错效果是没有意义的,因为非严格性意味着您无法确定何时执行效果。

    【讨论】:

      【解决方案4】:

      为什么 Haskell 有非严格函数,而标准 ML 没有?

      因为,haskell 中的表达式以弱头范式计算,而标准 ML 表达式以范式计算。

      然后,在 Haskell 中,您可以在标准 ML 中使用未评估的 thunk 进行推理。
      但是,您应该知道可以将惰性添加到标准 ML。 (例如,您可以在 ocaml 中执行此操作)

      haskell 中默认的惰性是一种设计选择,可能反映了这样一种信念,即创建一个默认处理惰性的编译器可以提高对函数式编程的理解,让研究社区向前迈出一步。

      【讨论】:

      • “因为,haskell 中的表达式是在弱头范式中计算的……”。我会反过来说:WHNF 评估是为了支持非严格函数。
      猜你喜欢
      • 2011-08-27
      • 2012-11-12
      • 2012-12-25
      • 2012-12-26
      • 1970-01-01
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2015-07-10
      相关资源
      最近更新 更多