I'm trying to define a function that creates infinite list of all possible words in my simple grammar. But ghci freezes when I enter head (generate [] [])
, although head (generate' [] [])
works fine (but I still want an infinite list). What's the problem?
data Start = Start deriving(Show)
data MyExpr = MyExprStart Start | MyExpr1 MyExpr | MyExpr2 MyExpr deriving(Show)
generate :: [MyExpr] -> [MyExpr] -> [MyExpr]
generate [] [] = generate [MyExprStart Start] []
generate current prev = generate (concatMap nextExprs current) (prev ++ current)
generate' :: [MyExpr] -> [MyExpr] -> [MyExpr]
generate' [] [] = generate' [MyExprStart Start] []
generate' current prev =
if (length current + length prev) < 5 then
generate' (concatMap nextExprs current) (prev ++ current)
else prev ++ current
nextExprs :: MyExpr -> [MyExpr]
nextExprs expr = [MyExpr1 expr, MyExpr2 expr]
UPD: Thank you, I got the point. I think I should define my function like that:
generate :: [MyExpr] -> [MyExpr]
generate [] = generate [MyExprStart Start]
generate current = current ++ generate (concatMap nextExprs current)