Monad Operations¶
hymn.operations
provide operations for monad computations
- hymn.operations.k_compose(*monadic_funcs)¶
right-to-left Kleisli composition of monads.
- <=<
alias of
k_compose()
=> (import hymn.operations [k-compose <=<])
=> (import hymn.dsl [Just Nothing])
=> (import numbers [Number])
=> (defn m-double [x] (if (isinstance x Number) (Just (* x 2)) Nothing))
=> (defn m-inc [x] (if (isinstance x Number) (Just (+ x 1)) Nothing))
=> (setv +1*2 (k-compose m-double m-inc))
=> (+1*2 1)
Just(4)
=> (setv *2+1 (<=< m-inc m-double))
=> (*2+1 2)
Just(5)
=> (*2+1 "two")
Nothing
- hymn.operations.k_pipe()¶
left-to-right Kleisli composition of monads.
- >=>
alias of
k_pipe()
=> (import hymn.operations [k-pipe >=>])
=> (import hymn.dsl [Just Nothing maybe])
=> (setv m-int (maybe int))
=> (defn m-array [n] (if (> n 0) (Just (* [0] n)) Nothing))
=> (setv make-array (k-pipe m-int m-array))
=> (make-array 0)
Nothing
=> (make-array 3)
Just([0, 0, 0])
=> (setv make-array (>=> m-int m-array))
=> (make-array 2)
Just([0, 0])
- hymn.operations.lift()¶
promote a function to a monad
=> (import hymn.operations [lift])
=> (import hymn.dsl [Just])
=> (import hy.pyops [+])
=> (setv m+ (lift +))
=> (m+ (Just 1) (Just 2))
Just(3)
- hymn.operations.m_map()¶
map monadic function mf to a sequence, then execute that sequence of monadic values
- m-map
alias of
m_map()
=> (import hymn.operations [m-map])
=> (import hymn.dsl [maybe-m])
=> (m-map maybe-m.unit (range 5))
Just([0, 1, 2, 3, 4])
=> (m-map (maybe-m.monadic (fn [x] (+ x 1))) (range 5))
Just([1, 2, 3, 4, 5])
=> (import hymn.dsl [tell])
=> (.execute (m-map tell (range 1 101)))
5050
- hymn.operations.replicate()¶
perform the monadic action n times, gathering the results
=> (import hymn.operations [replicate])
=> (import hymn.dsl [list-m])
=> (list (replicate 2 (list-m [0 1])))
[[0 0] [0 1] [1 0] [1 1]]
- hymn.operations.sequence()¶
evaluate each action in the sequence, and collect the results
=> (import hymn.operations [sequence])
=> (import hymn.dsl [tell])
=> (.execute (sequence (map tell (range 1 101))))
5050