Scala中是否具有“限制性”功能?
在
Scala MEAP v10的功能编程书中,笔者提到
并给出了例子 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类的值,即对的第二个元素.所以,这个神秘方法真的是第二个方法,它唯一合理的实现是: def second[A,B)): B = somePair._2 请注意,实际上,由于Scala既不纯也不完全,实际上还有其他一些方法可以做的:抛出一个异常(即异常返回),进入无限循环(即根本不返回),使用反映出B的实际类型,并反思地调用构造函数来构造新的值等. 然而,假设纯度(返回值可能只取决于参数),总体(方法必须正常返回值)和参数(它真的不知道有关A和B的东西),那么实际上有一个很糟糕的您可以通过查看其类型来了解方法. 这是另一个例子: def mysteryMethod(someBoolean: Boolean): Boolean = ??? 这可以做什么它总是可以返回false并忽略它的参数.但是它会被过度的限制:如果它总是忽略它的参数,那么它不在乎它是一个布尔值,它的类型将是 def alwaysFalse[A](something: A): Boolean = false // same for true,obviously 它总是可以返回自己的论据,但是再一次地,它实际上并不关心布尔,而它的类型也不会 def identity[A](something: A): A = something 所以真的,唯一可以做的是返回一个不同于布尔值的布尔值,而且由于只有两个布尔值,我们知道我们的神秘方法实际上不是: def not(someBoolean: Boolean): Boolean = if (someBoolean) false else true 所以,在这里,我们有一个例子,那些类型不给我们实现,但是至少它们是一个(小)的4个可能的实现,只有一个是有意义的. (顺便提一句:事实证明,只有一个方法的一个可能的实现方法,它接受A并返回一个A,它是上面显示的身份方法.) 所以,总结一下: 纯粹意味着你只能使用交给你的积木(论证) 将您的参数视为机器的一部分,并将其类型视为这些机器部件上的连接器.只能有限数量的方式将这些机器部件连接在一起,只能将兼容的连接器插入到一起,而且没有任何剩余部分.通常情况下,只有一种方式,或者如果有多种方式,那么往往会显然是正确的一种. 这意味着,一旦你设计了你的对象和方法的类型,你甚至不必考虑如何实现这些方法,因为这些类型已经规定了实现它们的唯一可能的方式!考虑到StackOverflow有多少个问题基本上是“如何实现这一点?”,你能想像如何释放它一定不必考虑一下,因为类型已经决定了一个(或几个)可能的实现? 现在,看看你的问题的方法的签名,并尝试用不同的方法来组合a和f,使得类型排队,你使用a和f,你会确实看到只有一个这样做的方式(正如克里斯和保罗所表示的那样.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |