【发布时间】:2016-05-06 18:48:13
【问题描述】:
在非常有启发性的演讲Constraints Liberate 中,Rúnar 说,只有一种方法可以实现具有此签名的函数:
def id[A](a: A): A
嗯,很明显。但是吹毛求疵的人可能会想出一个像
这样的实现def id[A](a: A): A = {
if (a.isInstanceOf[Integer])
5
else
a
}
好吧,我为什么要关心?
大名鼎鼎的Theorems for free! article中的函数也可以说完全一样的问题,但是我们有functions in the polymorphic lambda calculus的限制,在这种情况下Type-Casing肯定是无效的。
我正在寻找一种精确的方法来明确允许使用 Scala 语言的哪些子集,当我们说类似 “只有一个可能的具有此签名的纯函数实现:”
def id[A](a: A): A
【问题讨论】:
-
说到 nitpicks,
id的返回值应该是a,而不是A:) -
再吹毛求疵,
if (a.isInstanceOf[Integer]) { 5 }对 id 完全没有影响。你可能想要的是if (a.isInstanceOf[Integer]) { 5 } else a。 -
你知道什么是“纯函数”吗?
-
@pedrofurla 如果您的意思是
_.isInstanceOf[X]不是纯函数,我不同意。我没有看到任何副作用,输出完全由输入决定。特别是,如果你告诉我_.isInstanceOf[X]不是纯函数,那么_ == _也不再是纯函数了。 -
不,不是那个意思。你知道什么是总函数吗?
标签: scala lambda-calculus