Module state¶
Pythonic FP - State Monad
Handling state functionally.
##### class State - Classic FP State Monad
A pure FP immutable implementation for the State Monad.
translated to Python from the book “Functional Programming in Scala”
authors Chiusana & Bjarnason
run “action” returns a tuple
(a, s)
reversed to the typeState[S, A]
the standard convention seen in the FP community
another “factoid” to remember
choose the name
bind
instead offlatmap
the
flatmap
name is misleading for non-container-like monadsflatmap
name too long,bind
shorter to typewithout “do-notation”, code tends to march to the right
typing for the
modify
class method may be a bit suspect
- class pythonic_fp.fptools.state.State(run)¶
Data structure generating values while propagating changes of state.
class
State
represents neither a state nor (value, state) pairit wraps a transformation old_state -> (value, new_state)
the
run
method is this wrapped transformationbind
is just state propagating function composition
- Parameters:
run (
Callable
[[TypeVar
(S
)],tuple
[TypeVar
(A
),TypeVar
(S
)]])
- bind(g)¶
Perform function composition while propagating state.
- both(rb)¶
Return a tuple of two state actions.
- eval(init)¶
Evaluate the Monad via passing an initial state.
- Parameters:
init (
TypeVar
(S
))- Return type:
TypeVar
(A
)
- static get()¶
Set run action to return the current state
the current state is propagated unchanged
current value now set to current state
will need type annotation
- Return type:
State
[TypeVar
(ST
),TypeVar
(ST
)]
- map(f)¶
Map a function over a run action.
- Parameters:
f (
Callable
[[TypeVar
(A
)],TypeVar
(B
)])- Return type:
State
[TypeVar
(S
),TypeVar
(B
)]
- map2(sb, f)¶
Map a function of two variables over two state actions.
- static modify(f)¶
Modify previous state.
like put, but modify previous state via
f
will need type annotation
mypy has no “a priori” way to know what ST is
- Parameters:
f (
Callable
[[TypeVar
(ST
)],TypeVar
(ST
)])- Return type:
State
[TypeVar
(ST
),tuple
]
- static put(s)¶
Manually insert a state.
THe run action.
ignores previous state and swaps in a new state
assigns a canonically meaningless value to current value
- Parameters:
s (
TypeVar
(ST
))- Return type:
State
[TypeVar
(ST
),tuple
]
- static sequence(sas)¶
Combine a list of state actions into a state action of a list.
all state actions must be of the same type
run method evaluates list front to back