为什么C#本身不支持基于参数类型通过"动态重载"进行双重调度?我发现这需要动态调度,但由于虚拟方法调用也是动态调度的,因此对语言来说并不奇怪.那么为什么这个功能不属于C#呢?使用Reflection实现此功能的最优雅的解决方案是什么(可能有一些库)?
class Program
{
static void Main(string[] args)
{
var objs = new object[] { new Class1(), new Class2() };
foreach (var item in objs)
{
Method(item);
}
}
static void Method(Class1 obj)
{
}
static void Method(Class2 obj)
{
}
}
class Class1
{
}
class Class2
{
}
Run Code Online (Sandbox Code Playgroud)
确实更新了,因为Method在这个例子中不是虚拟的并且只采用一个参数,这仍然是单一调度,但是只要它> 0,调度的"基数"在这个问题中并不重要.
我正在编写一个用于在Perl 6中创建monad的库。由于仅使用常规参数角色就无法正确扩展monad(据我所知),因此我决定创建一个自定义元模型类,该类扩展Metamodel::ParametricRoleHOW并引入特殊语法来创建单子。问题是当我尝试写时monad MonadName[::T],会发生这种情况:
bastille% perl6 monad-test.p6
===SORRY!=== Error while compiling /home/morfent/Documents/p6-Monad/monad-test.p6
Unable to parse monad definition
at /home/morfent/Documents/p6-Monad/monad-test.p6:8
------> monad Identity?[::T] {
expecting any of:
generic role
Run Code Online (Sandbox Code Playgroud)
当我只写monad Identity { ... }时,尝试专门化类型时会抛出该错误。我该怎么写,使单子参数化?单子不具备准确扩展角色元模型,但我宁愿它是可以使用does与单子,而不是is。另外,即使我已经知道如何执行此操作,其他人也可能没有,因为我认为它没有记录在案,因此,如果您可以在回答中包括如何使任何类型的参数成为一般参数,那么这将是一个更好的参考。
这是我目前用于创建monad的代码:
use v6.d;
class Type::MonadHOW is Metamodel::ParametricRoleHOW {
has Int $!feature_flags;
my enum FeatureFlags (
Value => 0x1,
Bind => 0x2,
Then => 0x4,
Return => 0x8
);
method !set_value(\M, Attribute:D $attr) {
self.Metamodel::ParametricRoleHOW::add_attribute: M, $attr; …Run Code Online (Sandbox Code Playgroud) 我的印象是上下文边界只适用于方法:
trait Target[T]
class Post {
def pinTo[T : Target](t:T)
}
Run Code Online (Sandbox Code Playgroud)
显然,上下文界限也可用于class(并且可能trait):
trait Target[T]
class Post[T:Target] {
def pintTo[T](t:T)
}
Run Code Online (Sandbox Code Playgroud)
现在我对如何提供证据感到困惑Post?
class Business
implicit object ev extends Target[Business] // is implicit necessary here ?
val p = new Post[Business] // ?? how do I provide ev ?
Run Code Online (Sandbox Code Playgroud)
我发现多态性和重载有很多定义。
有人说重载是多态的一种。虽然有人说他们不一样。因为重载时只会分配一个函数。而多态性需要为每个重新定义的成员函数分配内存。我真的对此感到困惑。这对我来说有什么解释?
此外,重载是否发生在编译时,而多态性发生在运行时?
我想以通用方式检查C API的返回码,结果必须是免费的C类型,如libc::c_int.有没有办法写一个像这样的函数
fn check<S: PartialOrd + std::num::Zero, T> (x: S) -> Option<T> {
if std::num::zero::<S>() <= x { Some(x as T) }
else { None }
}
Run Code Online (Sandbox Code Playgroud)
当我确定这是S并且T是所有用法的整体类型check()?编译器拒绝我的代码抱怨error: non-scalar cast: `S` as `T`
JavaScript 中的函数式编程是否可以具有任何类型的多态性?
我喜欢 FP,但是当我想使用 JS 时,除了使用类/原型之外,我无法弄清楚如何在 JS 中支持多态性。
例如如何toString在 JS 中使用 FP实现?
使用 OOP,我可以简单地重载,toString以便object.toString()执行特定于object或其原型的 toString 代码。
javascript polymorphism types functional-programming parametric-polymorphism
我最近一直在学习β微积分。我了解未类型化和类型化的α演算之间的区别。但是,我对Hindley-Milner类型系统和类型化α-微积分之间的区别还不太清楚。是关于参数多态性还是其他差异?
谁能清楚指出两者之间的差异(和相似之处)?
functional-programming type-inference lambda-calculus hindley-milner parametric-polymorphism
据我所知,Prolog 没有任何内置的泛型编程机制。可以使用统一来模拟泛型,但这需要在运行时进行类型检查:
:- initialization(main).
:- set_prolog_flag(double_quotes, chars).
% this is a "generic" predicate, where A and B have the same type
add(A,B,C) :-
generic_types([A:Type,B:Type]),
(Type = number,
C is A + B;Type=var,C = A+B).
main :-
add(A,B,C),
add(3,4,D),
writeln(C),
writeln(D).
generic_types([]).
generic_types([A:B|C]) :-
member(B,[var,nonvar,float,rational,number,atom,atomic,compound,callable,ground,acyclic_term]),
call(B,A),
generic_types(C).
has_type(Type,A) :-
call(Type,A).
Run Code Online (Sandbox Code Playgroud)
是否可以在运行时不检查每个变量的类型的情况下编写“通用”谓词?
假设我有一个由多个多态变体(协变)组成的类型,如下所示:
[> `Ok of int | `Error of string]
Run Code Online (Sandbox Code Playgroud)
让我们进一步假设我想将此定义分解为某种类型构造函数和一个具体类型int。我的第一次尝试如下:
type 'a error = [> `Ok of 'a | `Error of string]
Run Code Online (Sandbox Code Playgroud)
然而,使用这样的定义会产生一个非常奇怪的类型错误,提到一个'b没有出现在定义中任何地方的类型变量。
$ ocaml
OCaml version 4.07.0
# type 'a error = [> `Ok of 'a | `Error of string ];;
Error: A type variable is unbound in this type declaration.
In type [> `Error of string | `Ok of 'a ] as 'b the variable 'b is unbound
Run Code Online (Sandbox Code Playgroud)
这'b是一个自动生成的名称,添加一个显式'b将变量转换为'c …
ocaml parametric-polymorphism polymorphic-variants row-polymorphism
在 C++ 中,您可以创建在模板化对象上使用特定运算符的模板化类,并且实例化这些对象的类必须重载该特定运算符才能使其对象与模板化类一起使用。例如,insertionBST 实现的方法可能依赖于<运算符,因此任何要存储在 BST 中的对象都必须实现该运算符。
如果可能,我如何对 Raku 中的参数化角色执行相同的操作?
为了提供一些上下文,例如将以下参数化角色定义为其自己的模块:
role BST[::T] {
my role BinaryNode[::T] {
has T $.item is rw;
has BinaryNode $.left is rw;
has BinaryNode $.right is rw;
}
has BinaryNode $!root;
method insert( BST:D: T $x --> Nil ) {
self!rec-insert($x, $!root)
}
method !rec-insert( T $x, BinaryNode $node is rw --> Nil ) {
if !$node.defined { $node = BinaryNode[$(T)].new(item => $x) }
elsif $x < $node.item { self!rec-insert($x, $node.left) …Run Code Online (Sandbox Code Playgroud)