Мне нужно создать конечный автомат, который равен функции поиска текстового редактора.
Мне нужно использовать foldl / foldr, чтобы применить функцию к каждому символу строки.
IУ меня есть несколько состояний, с которыми я должен работать:
type State = Int
start :: State
start = 0
accept :: State
accept = (-2)
reject :: State
reject = (-1)
И у меня есть тип synonim: type Definition = [(State, Char -> State)]
Функция должна выглядеть следующим образом: fsm :: Definition -> String -> Bool
Мой код выглядит следующим образом:
transition :: Char -> State -> (Char -> State)
transition x y z
| x == z = y
| x == '*' = y
| otherwise = reject
transitions :: [(Char, State)] -> (Char -> State)
transitions ((a,b):xs) e
| a == e || a == '*' = b
| a /= e || a /= '*' = transitions xs e
| otherwise = reject
step :: Definition -> State -> Char -> State
step ((a,b):xs) e f
| a == e = b f
| a /= e = step xs e f
| otherwise = reject
Он имеет начальное состояние, применяет функцию перехода или переходов, и, если он принят, следующее принятое состояние принимается.
Вот несколько тестов, которые я должен протестировать:
fsm [ (start, transition '*' accept)] "x" == True
fsm [ (start, transition 'a' 1)
, (1, transition 'l' 2)
, (2, transition '*' accept)
] "alma" == True
fsm [ (start, transition '*' 1)
, (1, transition '*' 2)
, (2, transition 'x' 3)
, (3, transition '*' accept)
] "taxi" == True
fsm [ (start, transitions [('\n',accept), ('*', 1)])
, (1, transition '*' start)
] "aa\n" == True