Как быть устойчивым к заказу?

Учитывая вход в форме 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)
Другие вопросы по тегам