gpt4 book ai didi

scala - Scala 中的多态函数是 "restrictive"吗?

转载 作者:行者123 更新时间:2023-12-03 23:17:23 25 4
gpt4 key购买 nike

在 Scala MEAP v10 中的函数式编程一书中,作者提到

Polymorphic functions are often so constrained by their type that they only have one implementation!



并举例
def partial1[A,B,C](a: A, f: (A,B) => C): B => C = (b: B) => f(a, b)

他这句话是什么意思?多态函数有限制吗?

最佳答案

这是一个更简单的例子:

def mysteryMethod[A, B](somePair: (A, B)): B = ???

这个方法有什么作用?事实证明,这种方法只能做一件事!您不需要方法的名称,不需要方法的实现,不需要任何文档。该类型会告诉您它可能做的所有事情,结果证明在这种情况下“所有事情”完全是一回事。

那么,它有什么作用呢?需要一对 (A, B)并返回一些 B 类型的值.它返回什么值?它可以构造一个类型为 B 的值吗? ?不,它不能,因为它不知道什么 B是!它可以返回类型为 B 的随机值吗? ?不,因为随机性是一种副作用,因此必须出现在类型签名中。能不能到宇宙去取一些 B ?不,因为这会产生副作用,并且必须出现在类型签名中!

事实上,它唯一能做的就是返回类型 B 的值。传递给它的,是对的第二个元素。所以,这个 mysteryMethod真的是 second方法,其唯一合理的实现是:
def second[A, B](somePair: (A, B)): B = somePair._2

请注意,实际上,由于 Scala 既不是纯粹的也不是完全的,因此该方法实际上可以做一些其他事情:抛出异常(即异常返回),进入无限循环(即根本不返回),使用反射以找出 B 的实际类型并反射性地调用构造函数来构造一个新值等。

但是,假设纯度(返回值可能仅取决于参数)、总体(该方法必须正常返回一个值)和参数性(它确实对 AB 一无所知),则在事实上,你可以通过只看它的类型来了解一个方法。

这是另一个例子:
def mysteryMethod(someBoolean: Boolean): Boolean = ???

这能做什么?它总是可以返回 false并忽略它的论点。但是它会被过度限制:如果它总是忽略它的参数,那么它不在乎它是一个 Boolean它的类型宁愿是
def alwaysFalse[A](something: A): Boolean = false // same for true, obviously

它总是可以只返回它的参数,但同样,它实际上并不关心 bool 值,它的类型宁愿是
def identity[A](something: A): A = something

所以,实际上,它唯一能做的就是返回一个与传入的 bool 值不同的 bool 值,而且由于只有两个 bool 值,我们知道我们的神秘方法实际上是 not :
def not(someBoolean: Boolean): Boolean = if (someBoolean) false else true

所以,在这里,我们有一个例子,其中的类型没有给我们实现,但至少,它们作为一个(小)集合 4 种可能的实现,其中只有一个是有意义的。

(顺便说一句:事实证明,只有一种可能的方法实现接受 A 并返回 A ,它就是上面显示的身份方法。)

所以,回顾一下:
  • 纯度意味着您只能使用交给您的构建块(参数)
  • 一个强大的、严格的、静态的类型系统意味着你只能以它们的类型对齐的方式使用这些构建块
  • 整体意味着你不能做愚蠢的事情(比如无限循环或抛出异常)
  • 参数化意味着您根本无法对您的类型变量做出任何假设

  • 将您的参数视为机器的一部分,将您的类型视为这些机器部件上的连接器。将这些机器零件连接在一起的方式只有有限的几种,即您只需将兼容的连接器插入在一起,并且没有任何剩余零件。通常情况下,只有一种方式,或者如果有多种方式,那么通常一种显然是正确的。

    这意味着,一旦您设计了对象和方法的类型,您甚至不必考虑如何实现这些方法,因为类型已经决定了实现它们的唯一可能方式!考虑到 StackOverflow 上有多少问题基本上都是“我如何实现这个?”,你能想象完全不必考虑它是多么的自由,因为类型已经决定了一个(或几个)可能的实现?

    现在,查看您问题中方法的签名,并尝试使用不同的方式来组合 af以这样的方式排列类型并且您使用两者 af你确实会看到只有一种方法可以做到这一点。 (正如克里斯和保罗所展示的那样。)

    关于scala - Scala 中的多态函数是 "restrictive"吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26032722/

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