Parsing 在Haskell中使用读取解析用户输入

Parsing 在Haskell中使用读取解析用户输入,parsing,haskell,Parsing,Haskell,我试图将用户输入的字符串(如A12)解析为Haskell元组(如“a”,12) 以下是我尝试过的: import Data.Maybe type Pos = (Char, Int) parse :: String -> Maybe Pos parse u = do (c, rest) <- (listToMaybe.reads) u (r, _) <- (listToMaybe.reads) rest return $ (c, r) 但这总是一无所获。为什么会

我试图将用户输入的字符串(如A12)解析为Haskell元组(如“a”,12)

以下是我尝试过的:

import Data.Maybe

type Pos = (Char, Int)

parse :: String -> Maybe Pos
parse u = do
  (c, rest) <- (listToMaybe.reads) u
  (r, _) <- (listToMaybe.reads) rest
  return $ (c, r)
但这总是一无所获。为什么会发生这种情况,正确的解析方法是什么?由于这相当简单,我希望避免使用Parsec或类似的高级解析库

编辑以澄清: 输入和输出示例:

A12只给出“A”,12

J5只给出“J”,5

A什么也不给

2324什么也不给

你必须使用Do符号吗?如果没有,则以下功能适合您的需要。这并不漂亮,但它完成了任务

parse :: String -> Maybe Pos
parse (x:xs) = Just (x,read xs::Int)
我不确定你认为什么是失败的,因此没有价值。如果没有,则以下功能适合您的需要。这并不漂亮,但它完成了任务

parse :: String -> Maybe Pos
parse (x:xs) = Just (x,read xs::Int)
<>我不知道你认为什么是失败的,因此值得一提的是

Read通常是显示的反义词,他们通常都用Haskell语法来表示给定的值。这意味着,由于字符的Haskell语法使用单引号,因此“在字符上显示”将在其周围添加单引号,而“读取”将期望单引号出现

换句话说,您的函数需要类似“A”42的语法,如果您尝试以下方法,它确实可以工作:

> parse "'A' 42"
Just ('A',42)
对于您的格式,我将对第一个字符使用模式匹配,然后读取其余字符,例如:

parse :: String -> Maybe Pos
parse [] = Nothing
parse (c:rest) = do
  (r, _) <- listToMaybe $ reads rest
  return (c, r)
read通常与show相反,它们通常都使用Haskell语法来表示给定的值。这意味着,由于字符的Haskell语法使用单引号,因此“在字符上显示”将在其周围添加单引号,而“读取”将期望单引号出现

换句话说,您的函数需要类似“A”42的语法,如果您尝试以下方法,它确实可以工作:

> parse "'A' 42"
Just ('A',42)
对于您的格式,我将对第一个字符使用模式匹配,然后读取其余字符,例如:

parse :: String -> Maybe Pos
parse [] = Nothing
parse (c:rest) = do
  (r, _) <- listToMaybe $ reads rest
  return (c, r)

请看问题中的编辑,它澄清了我的意思。此外,read xs::Int可能会在上面创建异常的回答中失败。在这种情况下,我只想得到一个零。请看问题中的编辑,它澄清了我的意思。此外,read xs::Int可能会在上面创建异常的回答中失败。在这种情况下,我只想一无所获。