- haskpy.types.list.List
List¶
- class List(*xs)[source]¶
Bases:
Monad
,Monoid
,Traversable
,Eq
- __add__(other)¶
Append two monoids
Using
+
operator to append two monoid values seems natural because that’s what Python is doing by default because lists are concatenated with+
.
- __annotations__ = {}¶
- __attrs_init__(List__xs) None ¶
Method generated by attrs for class List.
- __contains__(x)¶
Override elem if you want to change the default implementation
- __hash__ = None¶
- __iter__()¶
Override to_iter if you want to change the default implementation
- __len__()¶
Override length if you want to change the default implementation
- __lshift__(x)¶
Sequence with
<<
similarly as with<*
and<<
in Haskell
- __matmul__(x)¶
Application operand
@
applies similarly as<*>
in Haskellf @ x
translates tof.apply_to(x)
,x.apply(f)
andapply(f, x)
.Why
@
operator?It’s not typically used as often as some other more common operators so less risk for confusion.
The operator is not a commutative as isn’t
apply
either.If we see matrix as some structure, then matrix multiplication takes both left and right operand inside this structure and gives a result also inside this structure, similarly as
apply
does. So it’s an operator for two operands having a similar structure.The operator evaluates the contained function(s) at the contained value(s). Thus,
f
“at”x
makes perfect sense.
- __mod__(f)¶
Use
%
as bind operator similarly as>>=
in HaskellThat is,
x % f
is equivalent tobind(x, f)
andx.bind(f)
.Why
%
operator?It’s not very often used so less risk for confusion.
It’s not commutative as isn’t bind either.
It is similar to bind in a sense that the result has the same unit as the left operand while the right operand has different unit.
The symbol works visually as a line “binds” two circles and on the other hand two circles tell about two similar structures on both sides but those structures are just on different “level”.
- __ne__(other)¶
Inequality comparison:
Eq a => a -> a -> bool
Can be used as
!=
operator.The default implementation uses
__eq__
.
- __rpow__(f)¶
Lifting operator
**
lifts similarly as<$>
in Haskellf ** x
translates tox.map(f)
andmap(f, x)
.Why
**
operator?It’s not typically used as often as multiplication or addition so less risk of confusion.
It’s not commutative operator as isn’t lifting either.
The two operands have very different roles. They are not at the same “level”.
The right operand is “higher”, that is, it’s inside a structure and the left operand is kind of “raised to the power” of the second operand, where the “power” is the functorial structure.
The same operand is also used for function composition because function composition is just mapping. Visually the symbol can be seen as chaining two stars similarly as function composition chains two functions.
- __rshift__(x)¶
Sequence with
>>
similarly as with*>
and>>
in Haskell
- apply_first(x)¶
Combine two actions, keeping only the result of the first
Apply f => f a -> f b -> f a
- apply_second(x)¶
Combine two actions, keeping only the result of the second
Apply f => f a -> f b -> f b
- apply_to(x)¶
f (a -> b) -> f a -> f b
Default implementation is based on
apply
.
- flap(x)¶
Functor f => f (a -> b) -> a - > f b
- fold(monoid)¶
- fold2(monoid)¶
- fold_map(monoid, f)¶
Monoid m => t a -> (a -> m) -> m (ignoring
monoid
argument)The default implementation is based on
foldl
(or, if not implemented, recursively onfoldr
). Thus, all possibilities for parallelism is lost.monoid
is the monoidic class of the values inside the foldable. It is only used to determine the identity value.
- foldl(combine, initial)[source]¶
List a -> (b -> a -> b) -> b -> b
combine
function is assumed to be curried
- foldr(combine, initial)[source]¶
List a -> (a -> b -> b) -> b -> b
combine
function is assumed to be curried
- head(default)¶
Return head (or default if no head):
f a -> a -> a
- join()¶
m (m a) -> m a
Default implementation is based on
bind
:self :: m (m a)
identity :: m a -> m a
bind :: m (m a) -> (m a -> m a) -> m a
- length()[source]¶
t a -> int
The default implementation isn’t very efficient as it traverses through the iterator.
- null()¶
t a -> bool
- replace(x)¶
Haskell ($>) operator
- sum()¶
t a -> number
- to_iter()[source]¶
t a -> Iter a
Instead of to_list (as in Haskell), let’s provide to_iter. With iterables, we can write efficient implementations for many other methods (e.g., sum, elem) even for large or sometimes infinite foldables.
The default implementation isn’t very efficient as it uses folding to construct the iterator.
- traverse(applicative, func)¶
Map each element to an action and collect the results
For
Traversable t
:Applicative f => t a -> (a -> f b) -> f (t b)
The default implementation is based on
sequence
.