Power set: Difference between revisions

Line 163:
set[8] = (1, 2, 4);
</pre>
 
=={{header|AppleScript}}==
{{Trans|JavaScript}}
<lang AppleScript>-- powerset :: [a] -> [[a]]
on powerset(xs)
script subSet
on lambda(a, x)
script prependHead
on lambda(y)
{x} & y
end lambda
end script
a & map(prependHead, a)
end lambda
end script
foldr(subSet, {{}}, xs)
end powerset
 
-------------------------------------------------------------------------------------------
 
-- TEST
on run
script test
on lambda(x)
set {setName, setMembers} to x
{setName, powerset(setMembers)}
end lambda
end script
map(test, [¬
["Set [1,2,3]", {1, 2, 3}], ¬
["Empty set", {}], ¬
["Set containing only empty set", {{}}]])
--> {{"Set [1,2,3]", {{}, {3}, {2}, {2, 3}, {1}, {1, 3}, {1, 2}, {1, 2, 3}}},
--> {"Empty set", {{}}},
--> {"Set containing only empty set", {{}, {{}}}}}
end run
 
 
-- GENERIC FUNCTIONS ---------------------------------------------------------------
 
-- foldr :: (a -> b -> a) -> a -> [b] -> a
on foldr(f, startValue, xs)
tell mReturn(f)
set v to startValue
set lng to length of xs
repeat with i from lng to 1 by -1
set v to lambda(v, item i of xs, i, xs)
end repeat
return v
end tell
end foldr
 
-- map :: (a -> b) -> [a] -> [b]
on map(f, xs)
tell mReturn(f)
set lng to length of xs
set lst to {}
repeat with i from 1 to lng
set end of lst to lambda(item i of xs, i, xs)
end repeat
return lst
end tell
end map
 
-- Lift 2nd class handler function into 1st class script wrapper
-- mReturn :: Handler -> Script
on mReturn(f)
if class of f is script then
f
else
script
property lambda : f
end script
end if
end mReturn</lang>
 
{{Out}}
<lang AppleScript>{{"Set [1,2,3]", {{}, {3}, {2}, {2, 3}, {1}, {1, 3}, {1, 2}, {1, 2, 3}}},
{"Empty set", {{}}},
{"Set containing only empty set", {{}, {{}}}}}</lang>
 
=={{header|ATS}}==
9,659

edits