【问题标题】:Why the pointfree style does not cause a problem?为什么无点样式不会引起问题?
【发布时间】:2019-02-19 07:29:08
【问题描述】:

我从 https://www.haskell.org/tutorial/pitfalls.html 页面上读到了单态限制,但无法理解最后一点:

定义的函数经常违反限制 以更高阶的方式,如在 sum 的这个定义中 标准前奏:

sum = foldl (+) 0

按原样,这会导致静态类型错误。我们可以通过以下方式解决问题 添加类型签名:

sum :: (Num a) => [a] -> a

还要注意,如果我们这样写就不会出现这个问题:

sum xs = foldl (+) 0 xs

因为该限制仅适用于模式绑定。

为什么最后一点不会导致任何错误?

【问题讨论】:

  • 顺便说一句,最后一个方程没有使用无点样式,那就意味着避免提及xs

标签: haskell


【解决方案1】:

因为该限制仅适用于模式绑定。

本质上,当我们使用表单的函数绑定定义函数时,MR 并不适用

f arg1 ... argN = ...

N > 0.

直觉如下。 MR 的目的是避免将 Haskell 的非函数意外地变成低级函数。例如,

x = 3 + 4

不是函数。但是,它的类型是Num a => a,通常实现为从Num 字典到3+4 的结果的函数,其中+ 是字典定义的函数。这可能会导致性能下降,因为每次我们使用 x 时,总和都需要从头开始重新计算。例如,如果我们想计算 print (x :: Int) >> print (x :: Double),这是不可避免的。但实际上在不同类型上使用x 并不常见。

因此,MR 使x 成为单态,从而阻止我们在多个类型中使用它。这样就可以避免重新计算。

但是,如果x已经是一个函数,那么保持这种多态性并没有什么坏处,因为无论如何我们都在“重新计算”函数调用。因此,MR 不适用于函数绑定。

【讨论】:

  • sum = foldl (+) 0 是模式绑定吗?
  • DM 是什么意思?
  • @zero_coding 是的,不幸的是sum = ... 是一个模式绑定,MR 适用于它,即使它有一个函数类型。 (我希望有一个函数类型就足够了,但事实并非如此)。我们需要在= 的左边至少有一个函数参数。 (DM 是 MR 的错字——已修复!有时人们开玩笑地使用 DMR 来表示“可怕的单态限制”,所以我弄错了 :)
猜你喜欢
  • 2012-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 2020-12-18
相关资源
最近更新 更多