Как быть устойчивым к заказу?
Учитывая вход в форме A,B,C
где заказ не зафиксирован (например, C,B,A
может быть тоже возможно), как бы я разобрать строку в кортеж (a,b,c)
чтобы результат снова был упорядочен?
Большой пример:
Вход A:
A 1
B 2
C 3
Вход B:
C 3
B 2
A 1
Парсеры:
a = "A " *> decimal
b = "B " *> decimal
c = "C " *> decimal
Как мне написать парсер который даст (1,2,3)
для входа A и B.
Изменить: я должен быть более точным: они не все десятичные дроби... Остальное choice
будет выбор комбинатор здесь.
1 ответ
Решение
Вы можете использовать Text.Parsec.Perm:
{-# LANGUAGE TupleSections, NoMonomorphismRestriction #-}
import Text.Parsec
import Text.Parsec.Perm
import Control.Applicative
a = ...
b = ...
c = ...
p = permute (
(,,) <$$> a <||> b <||> c)