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