@@ -2,6 +2,7 @@
2module Hints (hints) where
2module Hints (hints) where
4import Control.Monad (liftM,mapM)
4import Control.Monad (liftM,mapM)
5+import Control.Arrow (first)
5import Types
6import Types
@@ -9,6 +10,7 @@ element = ADT "Element" []
9direction = ADT "Direction" []
10direction = ADT "Direction" []
10text = ADT "Text" []
11text = ADT "Text" []
11listOf t = ADT "List" [t]
12listOf t = ADT "List" [t]
13+tuple2 a b = ADT "Tuple2" [a,b]
12string = listOf CharT
14string = listOf CharT
@@ -70,19 +72,42 @@ funcs = sequence
70 , do [a,b,c] <- vars 3 ; "flip" -:: (a ==> b ==> c) ==> (b ==> a ==> c)
72 , do [a,b,c] <- vars 3 ; "flip" -:: (a ==> b ==> c) ==> (b ==> a ==> c)
71 , do [a,b,c] <- vars 3 ; "." -:: (b ==> c) ==> (a ==> b) ==> (a ==> c)
73 , do [a,b,c] <- vars 3 ; "." -:: (b ==> c) ==> (a ==> b) ==> (a ==> c)
72 , do [a,b] <- vars 2 ; "$" -:: (a ==> b) ==> a ==> b
74 , 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
84+ints = map (-: (listOf IntT ==> IntT)) [ "sum","product","maximum","minimum" ]
75−lists = sequence
86+lists = liftM (map (first ("List."++)) . (++ints)) . sequence $
76− [ do a <- var ; ":" -:: a ==> listOf a ==> listOf a
87+ [ "and" -:: listOf BoolT ==> BoolT
88+ , "or" -:: listOf BoolT ==> BoolT
77− , do a <- var ; "++" -:: listOf a ==> listOf a ==> listOf a
89+ , "sort" -:: listOf IntT ==> listOf IntT
78 , do a <- var ; "head" -:: listOf a ==> a
90 , do a <- var ; "head" -:: listOf a ==> a
79 , do a <- var ; "tail" -:: listOf a ==> listOf a
91 , do a <- var ; "tail" -:: listOf a ==> listOf a
80 , do a <- var ; "length" -:: listOf a ==> IntT
92 , do a <- var ; "length" -:: listOf a ==> IntT
81 , do a <- var ; "filter" -:: (a ==> BoolT) ==> listOf a ==> listOf a
93 , 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
82 , do a <- var ; "reverse" -:: listOf a ==> listOf a
100 , 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)
83 , do [a,b] <- vars 2 ; "map" -:: (a ==> b) ==> listOf a ==> listOf b
104 , do [a,b] <- vars 2 ; "map" -:: (a ==> b) ==> listOf a ==> listOf b
84 , do [a,b] <- vars 2 ; "foldr" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
105 , do [a,b] <- vars 2 ; "foldr" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
85 , do [a,b] <- vars 2 ; "foldl" -:: (a ==> b ==> b) ==> b ==> listOf a ==> b
106 , 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