blob: 9b56a43cd5591f878c976a3c84ab0f44e1bf3074 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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]])
|