Parsing 如何在Haskell中写入选项xp?

Parsing 如何在Haskell中写入选项xp?,parsing,haskell,Parsing,Haskell,我需要编写一个函数option xp,它试图应用解析器p。如果p 如果失败,则返回值x,否则返回p返回的值 option :: a -> Parser a -> Parser a option :: a -> Parser a -> Parser a option x p = case parse p x of [] -> x [(v,out)] -> [(v,out)] 上面是我写的,但不起作用。这里有什么问题?我

我需要编写一个函数
option xp
,它试图应用解析器p。如果p 如果失败,则返回值x,否则返回p返回的值

 option :: a -> Parser a -> Parser a
 option :: a -> Parser a -> Parser a
 option x p = case parse p x of
         [] -> x
         [(v,out)] -> [(v,out)]

上面是我写的,但不起作用。这里有什么问题?

我假设在这个答案中
type Parser=ReadS
parse=id

很接近,但您正试图向解析器传递一个结果类型的值——几乎可以肯定,您希望向解析器传递它应该解析以生成结果的字符串。此外,您不仅必须返回结果类型的值,还必须返回输入流的未解析位。因此:

option x p s {- extra argument -} = case parse p s {- pass s, not x -} of
    [] -> [(x, s)] {- return a value, and don't consume any input -}
    other -> other {- might as well work correctly if there are multiple parses -}

Parser
parse
的类型是什么?很多库都有自己的
Parser
,这取决于具体的类型,正如Sibi所说,但它可能类似于
p pure x