summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCamil Staps2016-03-03 14:44:14 +0100
committerCamil Staps2016-03-03 14:44:14 +0100
commit907ec31633cabc69ea060eae70766eabe4f747a6 (patch)
tree5dff93700ad9204c458c1f9d15e9a4c57b0524a9
parentctoclean (diff)
ZF implementation
-rw-r--r--zf.icl35
1 files changed, 35 insertions, 0 deletions
diff --git a/zf.icl b/zf.icl
new file mode 100644
index 0000000..9b56a43
--- /dev/null
+++ b/zf.icl
@@ -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]])
+