Data update
This commit is contained in:
parent
8e4e15fa56
commit
72eb4943cb
1853 changed files with 35514 additions and 9441 deletions
|
|
@ -0,0 +1,38 @@
|
|||
"""Parametric polymorphism. Requires Python >= 3.9."""
|
||||
|
||||
from typing import Callable
|
||||
from typing import Generic
|
||||
from typing import Iterable
|
||||
from typing import TypeVar
|
||||
from typing import Union
|
||||
|
||||
T = TypeVar("T")
|
||||
|
||||
|
||||
class Tree(Generic[T]):
|
||||
def __init__(self, value: T):
|
||||
self.value = value
|
||||
self.left: Union[Tree[T], None] = None
|
||||
self.right: Union[Tree[T], None] = None
|
||||
|
||||
def map(self, func: Callable[[T], T]) -> Iterable[T]:
|
||||
yield func(self.value)
|
||||
if self.left is not None:
|
||||
yield from self.left.map(func)
|
||||
if self.right is not None:
|
||||
yield from self.right.map(func)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
tree = Tree(7)
|
||||
tree.left = Tree(42)
|
||||
tree.right = Tree(101)
|
||||
tree.right.left = Tree(1)
|
||||
|
||||
# Fails static type checking as "foo" is not an int.
|
||||
# tree.left.left = Tree[int]("foo")
|
||||
|
||||
# Fails static type checking as Tree[str] is not Tree[int]
|
||||
# tree.left.left = Tree("bar")
|
||||
|
||||
print(list(tree.map(lambda v: v + 1))) # [8, 43, 102, 2]
|
||||
|
|
@ -0,0 +1,33 @@
|
|||
"""Parametric polymorphism. Requires Python >= 3.12."""
|
||||
|
||||
from typing import Callable
|
||||
from typing import Iterable
|
||||
|
||||
|
||||
class Tree[T]:
|
||||
def __init__(self, value: T):
|
||||
self.value = value
|
||||
self.left: Tree[T] | None = None
|
||||
self.right: Tree[T] | None = None
|
||||
|
||||
def map(self, func: Callable[[T], T]) -> Iterable[T]:
|
||||
yield func(self.value)
|
||||
if self.left is not None:
|
||||
yield from self.left.map(func)
|
||||
if self.right is not None:
|
||||
yield from self.right.map(func)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
tree = Tree(7)
|
||||
tree.left = Tree(42)
|
||||
tree.right = Tree(101)
|
||||
tree.right.left = Tree(1)
|
||||
|
||||
# Fails static type checking as "foo" is not an int.
|
||||
# tree.left.left = Tree[int]("foo")
|
||||
|
||||
# Fails static type checking as Tree[str] is not Tree[int]
|
||||
# tree.left.left = Tree("bar")
|
||||
|
||||
print(list(tree.map(lambda v: v + 1))) # [8, 43, 102, 2]
|
||||
33
Task/Parametric-polymorphism/Zig/parametric-polymorphism.zig
Normal file
33
Task/Parametric-polymorphism/Zig/parametric-polymorphism.zig
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
const std = @import("std");
|
||||
|
||||
pub fn main() void {
|
||||
var tree = Tree(u8).init(10);
|
||||
std.debug.print("Before: {}\n", .{tree.value});
|
||||
tree.replace_all(65);
|
||||
std.debug.print("After: {}\n", .{tree.value});
|
||||
|
||||
}
|
||||
|
||||
pub fn Tree(T: type) type {
|
||||
|
||||
return struct {
|
||||
const Self = @This();
|
||||
value: T,
|
||||
left: ?*Self,
|
||||
right: ?*Self,
|
||||
|
||||
pub fn init(value: T) Self {
|
||||
return Self{
|
||||
.value = value,
|
||||
.left = null,
|
||||
.right = null,
|
||||
};
|
||||
}
|
||||
|
||||
pub fn replace_all(self: *Self, value: T) void {
|
||||
self.value = value;
|
||||
if (self.left) |_| self.left.?.replace_all(value);
|
||||
if (self.right) |_| self.right.?.replace_all(value);
|
||||
}
|
||||
};
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue