Modifying formatters in Haskell's formatting library -
i'm using chris done's formatting library (specifically formatting-6.0.0). i'm finding difficult construct `higher order' function maps formatter list formatter, performing custom action on resultant list of builders:
list :: ([builder] -> builder) -> format r (a -> r) -> format r ([a] -> r) this desirable because allows me embed builder formatting logic in format string.
as example, suppose builder function mconcat. format (list mconcat int) [1,2,3] yield "123". in practice, may use builder function formats list english list, such output above input "1, 2 , 3".
thanks help!
let's expand out format types list :: ([builder] -> builder) -> format r (a -> r) -> format r ([a] -> r)
format r (a -> r) -> format r ([a] -> r) holey builder r (a -> r) -> holey builder r ([a] -> r) ( (builder -> r) -> (a -> r))->( (builder -> r) -> ([a] -> r)) we can try build definition of list.
list append m = holey $ \k -> ... we need return [a] -> r ... is. don't have many possible moves because know nothing type r. can pass k :: builder -> r runhm m a -> r. if map on [a] have [r], know nothing r, can't it.
if function list exists has different type ([builder] -> builder) -> format r (a -> r) -> format r ([a] -> r).
we can define list different type list :: ([builder] -> builder) -> format builder (a -> builder) -> format r ([a] -> r). should work first arguments since of formatting components universally qualified on r.
list append m = holey $ \k -> k . append . map (runhm m id) this can written more succinctly as
list append m = later (append . map (bprint m))
Comments
Post a Comment