Advertisement
Guest User

Untitled

a guest
Jul 23rd, 2017
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.55 KB | None | 0 0
  1. module FunctionEvaluator where
  2.  
  3. import qualified Data.Map.Strict as M
  4.  
  5. evaluateFunction :: Ord a => (a -> Either b ([a], [b] -> b)) -> a -> b
  6. evaluateFunction f x = snd $ memoize x M.empty
  7. where
  8. memoize n m = case M.lookup n m of
  9. Just v -> (m, v)
  10. Nothing ->
  11. case f n of
  12. Left v -> (M.insert n v m, v)
  13. Right (as, aggF) ->
  14. let folder = \(accM, accBs) a -> let (m, v) = memoize a accM in (m, v:accBs) in
  15. let (m', bs) = foldl folder (m, []) as in
  16. let v = aggF bs in (M.insert n v m', v)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement