Я считаю, что вы хотите использовать sepBy
.
type AST =
| Arguments of AST list
| Argument of string * string
let parseArguments =
spaces
>>. pchar '('
>>. spaces
>>. sepBy parseArgument (pchar ',')
.>> spaces
.>> pchar ')'
|>> Arguments
Под редакцией devoured_elysium:
Приведенный выше код верен, хотя он не компилируется. Я опубликую здесь свою версию для компиляции, так что если кто-то захочет попробовать код без дальнейших церемоний, он сможет это сделать.
type AST =
| Arguments of AST list
| Argument of string
let parseArguments =
spaces
>>. pchar '('
>>. spaces
>>. sepBy (many1Satisfy isLetter |>> Argument) (pchar ',')
.>> spaces
.>> pchar ')'
|>> Arguments
test parseArguments "(a,b,c)" //succeed
test parseArguments "(a,b,c,)" //fail