Для назначения нам нужно было реализовать что-то вроде очень простого синтаксического анализатора, например, для ввода:
"((a b) ((c d) e) f)"
Возвращалось бы:
[["a", "b"], [["c", "d"], "e"], "f"]
Так какчасть большего присваивания, синтаксический анализатор только дает допустимый ввод (совпадающие символы & c).Я предложил следующее решение в Ruby:
def parse s, start, stop
tokens = s.scan(/#{Regexp.escape(start)}|#{Regexp.escape(stop)}|\w+/)
stack = [[]]
tokens.each do |tok|
case tok
when start
stack << []
when stop
stack[-2] << stack.pop
else
stack[-1] << tok
end
end
return stack[-1][-1]
end
Возможно, это не лучшее решение, но оно делает свою работу.
Теперь я заинтересован в идиоматическом решении Haskellдля основной функциональности (т. е. меня не волнует лексизация или выбор разделителей, хорошо бы взять уже лексированный ввод), если это возможно, используя только "основной" haskell, без расширений или библиотек, таких как parsec.Обратите внимание, что это НЕ является частью задания, я просто заинтересован в способе действий Haskell.