@@ -2,6 +2,7 @@
22module Hints (hints) where
33
44import Control.Monad (liftM,mapM)
5+import Control.Arrow (first)
56import Types
67import Guid
78
@@ -9,6 +10,7 @@ element = ADT "Element" []
910direction = ADT "Direction" []
1011text = ADT "Text" []
1112listOf t = ADT "List" [t]
13+tuple2 a b = ADT "Tuple2" [a,b]
1214string = listOf CharT
1315
1416infixr ==>
@@ -70,19 +72,42 @@ funcs = sequence
7072 , do [a,b,c] <- vars 3 ; "flip" -:: (a ==> b ==> c) ==> (b ==> a ==> c)
7173 , do [a,b,c] <- vars 3 ; "." -:: (b ==> c) ==> (a ==> b) ==> (a ==> c)
7274 , do [a,b] <- vars 2 ; "$" -:: (a ==> b) ==> a ==> b
75+ , do a <- var ; ":" -:: a ==> listOf a ==> listOf a
76+ , do a <- var ; "++" -:: listOf a ==> listOf a ==> listOf a
77+ , do a <- var ; "Cons" -:: a ==> listOf a ==> listOf a
78+ , do a <- var ; "Nil" -:: listOf a
79+ , do a <- var ; "Just" -:: a ==> ADT "Maybe" [a]
80+ , do a <- var ; "Nothing" -:: ADT "Maybe" [a]
81+ , "elmRange" -:: IntT ==> IntT ==> listOf IntT
7382 ]
7483
75−lists = sequence
76− [ do a <- var ; ":" -:: a ==> listOf a ==> listOf a
77− , do a <- var ; "++" -:: listOf a ==> listOf a ==> listOf a
84+ints = map (-: (listOf IntT ==> IntT)) [ "sum","product","maximum","minimum" ]
85+
86+lists = liftM (map (first ("List."++)) . (++ints)) . sequence $
87+ [ "and" -:: listOf BoolT ==> BoolT
88+ , "or" -:: listOf BoolT ==> BoolT
89+ , "sort" -:: listOf IntT ==> listOf IntT
7890 , do a <- var ; "head" -:: listOf a ==> a
7991 , do a <- var ; "tail" -:: listOf a ==> listOf a
8092 , do a <- var ; "length" -:: listOf a ==> IntT
8193 , do a <- var ; "filter" -:: (a ==> BoolT) ==> listOf a ==> listOf a
94+ , do a <- var ; "foldr1" -:: (a ==> a ==> a) ==> listOf a ==> a
95+ , do a <- var ; "foldl1" -:: (a ==> a ==> a) ==> listOf a ==> a
96+ , do a <- var ; "scanl1" -:: (a ==> a ==> a) ==> listOf a ==> a
97+ , do a <- var ; "forall" -:: (a ==> BoolT) ==> listOf a ==> BoolT
98+ , do a <- var ; "exists" -:: (a ==> BoolT) ==> listOf a ==> BoolT
99+ , do a <- var ; "concat" -:: listOf (listOf a) ==> listOf a
82100 , do a <- var ; "reverse" -:: listOf a ==> listOf a
101+ , do a <- var ; "intersperse" -:: a ==> listOf a ==> listOf a
102+ , do a <- var ; "intercalate" -:: listOf a ==> listOf(listOf a) ==> listOf a
103+ , do [a,b] <- vars 2 ; "zip" -:: listOf a ==>listOf b ==>listOf(tuple2 a b)
83104 , do [a,b] <- vars 2 ; "map" -:: (a ==> b) ==> listOf a ==> listOf b
84105 , do [a,b] <- vars 2 ; "foldr" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
85106 , do [a,b] <- vars 2 ; "foldl" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
107+ , do [a,b] <- vars 2 ; "scanl" -:: (a==>b==>b)==>b==>listOf a==>listOf b
108+ , do [a,b] <- vars 2 ; "concatMap" -:: (a==>listOf b)==>listOf a ==> listOf b
109+ , do [a,b,c] <- vars 3
110+ "zipWith" -:: (a ==> b ==> c) ==> listOf a ==> listOf b ==> listOf c
86111 ]
87112
88113