Я пытаюсь разобрать вложенные списки в Agda. Я искал в google, и ближайший, который я нашел, - это парсинг, адресованный в Haskell, но обычно используются такие библиотеки, как "parsec", которые недоступны в Agda.
Итак, я хотел бы проанализировать "((1,2,3),(4,5,6))"
с типом результата (List (List Nat))
.
И должны поддерживаться дополнительные вложенные списки (до глубины 5), например, глубина 3 будет (List (List (List Nat)))
.
Мой код очень длинный и громоздкий, и он работает только для (List (List Nat))
, но не для дополнительных вложенных списков. Я не сделал никакого прогресса сам по себе.
Если это полезно, я хотел бы повторно использовать splitBy
из первого ответа одной из моих старых сообщений.
NesList : ℕ → Set
NesList 0 = ℕ -- this case is easy
NesList 1 = List ℕ -- this case is easy
NesList 2 = List (List ℕ)
NesList 3 = List (List (List ℕ))
NesList 4 = List (List (List (List ℕ)))
NesList 5 = List (List (List (List (List ℕ)))) -- I am only interested to list depth 5
NesList _ = ℕ -- this is a hack, but I think okay for now
-- My implementation is *not* shown here
--
--
-- (it about 80 lines long and uses 3 different functions
parseList2 : List Char → Maybe (List (List ℕ))
parseList2 _ = nothing -- dummy result
parseList : (dept : ℕ) → String → Maybe (NesList dept)
parseList 2 s = parseList2 (toList s)
parseList _ _ = nothing
-- Test Cases that are working (in my version)
p1 : parseList 2 "((1,2,3),(4,5,6))" ≡ just ((1 ∷ 2 ∷ 3 ∷ []) ∷ (4 ∷ 5 ∷ 6 ∷ []) ∷ [])
p1 = refl
p2 : parseList 2 "((1,2,3),(4,5,6),(7,8,9,10))" ≡ just ((1 ∷ 2 ∷ 3 ∷ []) ∷ (4 ∷ 5 ∷ 6 ∷ []) ∷ (7 ∷ 8 ∷ 9 ∷ 10 ∷ []) ∷ [])
p2 = refl
p3 : parseList 2 "((1),(2))" ≡ just ((1 ∷ []) ∷ (2 ∷ []) ∷ [])
p3 = refl
p4 : parseList 2 "((1,2))" ≡ just ((1 ∷ 2 ∷ []) ∷ [])
p4 = refl
-- Test Cases that are not working
-- i.e., List (List (List Nat))
lp5 : parseList 3 "(((1,2),(3,4)),((5,6),(7,8)))" ≡ just ( ((1 ∷ 2 ∷ []) ∷ (3 ∷ 4 ∷ []) ∷ []) ∷ ((5 ∷ 6 ∷ []) ∷ (7 ∷ 8 ∷ []) ∷ []) ∷ [])
lp5 = refl
EDIT1 **
Коннор разговаривает в ICFP онлайн - титул "Агда-любопытно?".
Это с двух дней назад. Проверьте это!
.
Смотрите видео:
http://www.youtube.com/watch?v=XGyJ519RY6Y
- Страница
EDIT2:
Я нашел ссылку, которая кажется почти кодом, который мне нужен для моего разбора.
Существует функция tokenize
:
https://github.com/fkettelhoit/agda-prelude/blob/master/Examples/PrefixCalculator.agda
- Страница
EDIT3:
Наконец, я нашел простую библиотеку комбинаторов, которая должна быть достаточно быстрой. В библиотеке нет примеров, поэтому мне все равно нужно посмотреть, как решить проблему.
Вот ссылка:
https://github.com/crypto-agda/agda-nplib/blob/master/lib/Text/Parser.agda
Существует больше agda-кода от Nicolas Pouillard онлайн:
https://github.com/crypto-agda