diff options
author | Camil Staps | 2016-03-03 14:44:14 +0100 |
---|---|---|
committer | Camil Staps | 2016-03-03 14:44:14 +0100 |
commit | 907ec31633cabc69ea060eae70766eabe4f747a6 (patch) | |
tree | 5dff93700ad9204c458c1f9d15e9a4c57b0524a9 | |
parent | ctoclean (diff) |
ZF implementation
-rw-r--r-- | zf.icl | 35 |
1 files changed, 35 insertions, 0 deletions
@@ -0,0 +1,35 @@ +module zf + +import StdEnum, StdFunc, StdList, StdTuple, StdString + +:: ZFExpr a b = ZF ((String -> a) -> b) [ZFGet a] + +:: ZFGet a = (<--) infixl 7 String [a] + +name :: (ZFGet a) -> String +name (n <-- _) = n +names = map name + +values :: (ZFGet a) -> [a] +values (_ <-- vs) = vs +valuess = map values + +eval :: (ZFExpr a b) -> [b] +eval (ZF f []) = [] +eval (ZF f gs) = zf (\vset.f (\n.(snd o hd o filter (\(s,_).s==n)) vset)) vsets +where + vsets = product (zf (\(s <-- vs).zf (\v.(s,v)) vs) gs) + +product :: [[a]] -> [[a]] +product [] = [[]] +product [xs:xss] = zf2 (\x xs`.[x:xs`]) xs (product xss) +where + zf2 :: (a b -> c) [a] [b] -> [c] + zf2 f as bs = flatten (zf (\b.zf (\a.f a b) as) bs) + +zf :: (a -> b) [a] -> [b] +zf _ [] = [] +zf f [x:xs] = [f x:zf f xs] + +Start = eval (ZF (\v . (v "x" * (v "y"))) ["x" <-- [2..4], "y" <-- [10..11]]) + |