我试图掌握多态性的概念,我有点理解它在OOP的上下文中是什么,但我读到它也可以应用于过程编程,我不太明白它是如何实现的。
例如,我知道Python中有很多方法和操作符,它们已经使用了多态性,但是我编写的函数会被限定为多态函数吗?例如,下面的函数what_type是否被认为是多态的,因为根据定义,它根据它所接收的参数的数据类型而具有不同的行为,还是这仅仅是一个带有条件语句的函数的常规示例?
def what_type(input_var):
'Returns a statement of the data type of the input variable'
因此,我一直在搜索关于parametric polymorphism和adhoc-polymorphism之间的主要区别的文档,但我仍然有一些疑问。
例如,集合中的head之类的方法显然是参数多态,因为用于在ListInt中获取头部的代码与任何其他列表中的代码相同。
List[T] {
def head: T = this match {
case x :: xs => x
case Nil => throw new RuntimeException("Head of empty List.")
}
}
(不确定这是
对于instance Alternative [],(<|>) = (++)。因此,我认为(<|>)是一种拼接器,导致了看似几乎通用的容器转换器:
-- (<|>) = generalization of (++)
(<|) :: Alternative f => x -> f x -> f x
x <| xs = pure x <|> xs
conv :: (Foldable t, Alternative f) => t x -> f x
conv = foldr (<|) empty
实际上
我正在尝试理解python中的多态性。我读了很多文章,但在我的脑海中仍然有一个疑问。当我将它与java进行比较时,我在Python中感到有点困惑。
请参见下面的代码。
public class Main{
public static void main(String[] args) {
System.out.println(add(1,2));;
System.out.println(add(1,2,3));
}
public static int add(int a,int b){
return a+b;
}
为什么方法重载称为静态或编译时多态性
以Java为样本。
class StaticPolymorphismSample {
void polymorphicMethod(int a) {
}
void polymorphicMethod(int a, int b) {
}
void polymorphicMethod(String a) {
}
void nonPolymorphicMethod(int a) {
}
void nonPolymorphicMethod1(int a) {
}
}
所以我
我试图掌握这两个概念之间的关系。
首先考虑一个抽象数据类型的示例
data Tree a = Nil
| Node { left :: Tree a,
value :: a,
right :: Tree a }
根据Haskell wiki的说法:
这种类型是抽象的,因为它使其结构的某些方面没有定义,由数据类型的用户提供。这是抽象数据类型的一种弱形式。
现在考虑参数多态的概念。
参数多态是指值的类型包含一个或多个(无约束)类型变量时,因此该值可以采用以具体类型替换这些变量的
我在试着自己去理解,OCaml语言有哪种形式的多态。
我得到了一个例子
let id x = x
这个示例不是等同于C++模板函数吗
template<class A> A id(A x) { return x; }
如果是这样,那么我的问题是: OCaml中是否还有其他形式的多态性?在命令式语言的世界中,这个概念被称为“通用算法”,而不是“多态性”。
许多语言都支持 (a.k.a )。功能重载)开箱即用。然而,Python似乎选择了退出它。不过,我可以想象可能有一个技巧或一个库能够在Python中实现它。有人知道这样的工具吗?
例如,在Haskell中,可以使用它为不同类型生成测试数据:
-- In some testing library:
class Randomizable a where
genRandom :: a
-- Overload for different types
instance Randomizable String where genRandom = ...
instance Randomizable
在print_int中有一系列的函数,比如print_endline和Printf。我不能做这样的事
let n = 10 in
print n;; (* And I haven't to change `print` in case type of `n` changed *)
这是多态打印,如Java、C#、Python等。相反,我们有由程序员显式定义的类C类型。所以我认为OCaml在编译过程中丢失了类型信息,并且在运行时没有这些信息,对吗?这也是我们需要mli文件的原因吗?
编辑:,我厌倦了编写像*print_listi*、*print_list_tuple2i*等函数。我怎样才