Para efeitos de documentação (uma vez que creio que o problema já não exista devido à ausência de feedback), deixo aqui uma solução, usando as 2 vertentes do fold:
type Expansion a = [a]
type Rule a = (a,Expansion a)
type Rules a = [Rule a]
regras :: Rules Int
regras = [(1,[2,1]),(2,[0,2,1])]
getExpansion :: Eq a => Rules a -> a -> [a]
getExpansion [] x = [x]
getExpansion ((el,exp):rs) x | el==x = exp
| otherwise = getExpansion rs x
getExpansionFoldr :: Eq a => Rules a -> a -> [a]
getExpansionFoldr rs x = foldr (\(el,exp) y -> if (el==x) then exp else y) [x] rs
getExpansionFoldl :: Eq a => Rules a -> a -> [a]
getExpansionFoldl rs x = foldl (\y (el,exp) -> if (el==x) then exp else y) [x] rs
Mais sobre foldr e foldl aqui:
↧