2013-04-19 2 views
0
scanl (\exp y -> scanl (\x -> if (isLetter x) then update exp (Literal x) "" else 
        if x=='+' then update exp Epsilon "+" else 
        if x=='*' then update exp Epsilon "*" else 
        update exp Epsilon "|") y) Epsilon q 

У меня есть список [Char], и я хочу преобразовать их в свой тип данных, но у меня возникают некоторые проблемы с ним. У меня есть somenthing, как это ["a + b", "c * d"], и я хочу получить результат, когда я применяю scanl на "a + b" , чтобы оставаться таким, чтобы я мог использовать его для второго списка. Кто-нибудь может мне помочь ?Scanl in Haskell

Мой тип данных:

data Reg = Epsilon | Literal Char | Or Reg Reg | Then Reg Reg | Star Reg deriving Eq 

и

update:: Reg -> Reg -> [Char] -> Reg 
update a b "" = (a `Then` b) 
update a b "|"= (a `Or` b) 
update a b "*" = (Star a) 
update a b "+" = (plus a) 
update a b "?" = (opt a) 

И я пытаюсь что-то преобразование, как это [ "а |", "Ьс"] к (Тогда (Или до н.э.))

+2

Можете ли вы дать немного больше контекста о большой картине? Что такое 'Literal' и' Epsilon'? Что делает 'update'? Что вы пытаетесь достичь в целом? – AndrewC

+0

@AndrewC Это, казалось бы, идеализированный NFA. Я не знаю, что должно делать выражение 'scanl', но тип Reg явно соответствует недетерминированным регулярным выражениям. – Carl

+0

@Carl Это видно из редактирования Edy, сделанного после моего комментария, да. – AndrewC

ответ

0

Для записи scanl не очень хорош при передаче состояния, и особенно здесь вы не хотите, чтобы результат был списком вообще, а всего лишь конечный результат. Более обобщенный подход состоял бы в том, чтобы вместо этого использовать fold.