Я следую «языкам программирования» по Udacity и пытаюсь представить наборы задач в Haskell. Ответы записываются в Python:Представить недетерминированный конечный машинный симулятор машины в Haskell
edges = {(1,"a") : [2,3]
,(2,"a") : [2]
,(3,"b") : [3,4]
,(4,"c") : [5]}
accepting = [2,5]
def nfsmSim(string, current, edges, accepting):
if string == "":
return current in accepting
else:
letter = string[0]
key = (current, letter)
if key in edges:
rest = string[1:]
states = edges[key]
for state in states:
if nfsmSim(rest, state, edges, accepting):
return True
return False
Исходное состояние всегда первое состояние, т.е. current = 1
.
Строки, такие как "aaa"
или "abc"
принимаются в то время как "abb"
или "aabc"
или отклонено.
Моя попытка перезаписи с помощью Haskell:
nfsmSim [] c _ = [c]
nfsmSim xs c es = [concat $ nfsmSim (tail xs) s es | (k,ss) <- es, s <- ss, x <- xs, k==(c,x)]
Я хочу вернуть список целых чисел, которые представляют собой последнее состояние в конце входной строки, а затем filter
они против принимающих государств и использовать any
для получить окончательный True
или False
.
Я понимаю, что это, вероятно, не способ Haskell сделать это и что, вероятно, есть лучшее решение wholemeal
. Однако, как новичок, я борюсь с механизмом мондадизма и, скорее всего, рекурсивным характером этой проблемы.
Пожалуйста, укажите меня в правильном направлении, возможно, используя нотацию do
, а не список.
Не могли бы вы добавить ссылку на упражнения, если это возможно? – Zeta
@Zeta [языки программирования] (https://www.udacity.com/course/programming-languages--cs262) – potong