【问题标题】:Haskell readLn no parse errorHaskell readLn 没有解析错误
【发布时间】:2012-03-12 12:56:50
【问题描述】:

此函数允许用户输入字符串列表。该函数采用长度并允许用户输入长度为 1 的更多行。然后检查每一行以确保它与原始行的长度相同。代码:

readme :: IO [Line]
readme = do
 line <- readLn
 let count = length line
 lines <- replicateM (count-1) $ do 
  line <- readLn
  if length line /= count 
  then fail "too long or too short"
  else return line 
 return $ line : lines

行是字符串类型。

当我尝试运行该函数并输入..say ["12","13"] 我得到以下信息:* 异常:用户错误(Prelude.readIO:无解析)和我不知道为什么,有什么想法吗?

【问题讨论】:

    标签: parsing haskell io


    【解决方案1】:

    这是因为您试图读取错误类型的内容。

    你说LineString aka。 [Char]。但是,您输入的输入格式为["12", "13"],看起来应该是[Line] 类型,又名。 [String][[Char]]

    您需要解释Line 实际上应该是什么。如果您希望 Line 成为字符串,那么为什么要在终端输入字符串列表?在这种情况下,您的逻辑有问题。

    如果你想要一种输入方阵的方法,你可以让type Line = [Int] 代替,并使用以下格式之一:

    -- What you type at the terminal:
    1 -2 3
    4 5 6
    6 7 8
    
    -- How to read it in your program:
    line <- (map read . words) `fmap` getLine
    
    -- What you type at the terminal:
    [1, -2, 3]
    [4, 5, 6]
    [6, 7, 8]
    
    -- How to read it in your program:
    line <- readLn
    

    如果你真的想输入行,那么type Line = [Char],并且输入列表中的每个数字都变成一个unicode字符,这意味着当你在终端输入[97, 98, 99]时,你会得到字符串"abc"

    -- What you type at the terminal:
    [97, 98, 99]
    [100, 101, 102]
    [103, 104, 105]
    
    -- How to read it in your program:
    line <- (map toEnum) `fmap` readLn
    

    【讨论】:

    • 本质上自述文件是用来检查数独方块的输入以确保行的长度相同,即输入 ["1","2","3"] 表示多 2 行应该输入(因为它将是一个 3x3 网格),并且两者的长度都应该是 3。
    【解决方案2】:

    如果有任何帮助,您的程序将接受以下输入:

    *Main> readme
    "abc"
    "123"
    "456"
    ["abc","123","456"]
    

    您可能打算写getLine 而不是readLn,但是在不知道您的程序的目的的情况下,这有点难以判断。

    改成getLine,程序接受:

    *Main> readme
    abc
    123
    456
    ["abc","123","456"]
    

    【讨论】:

    • 他有几个老问题可以解释他的意图。他之前尝试过使用getLine,但显然这不是他想要的,因为他想测量用户输入的(逻辑)列表的长度,而不是字符串的长度。
    【解决方案3】:

    read 对用户不是很友好,它不会将["12","13"] 视为字符串。它将接受"123"['1','2','3'] 甚至"[\"12\",\"13\"]" - 换句话说,必须像在您的程序中那样编写字符串。在这种情况下,您不需要使用read,因为您只是在读取String,因此将readLn 替换为getLine 会起作用。

    【讨论】:

    • 他实际上并不想将输入读取为字符串;查看用户的旧问题以供参考。
    • 哇,你真的做了功课,点个赞吧。顺便说一句 - 你有没有在你的个人资料照片中写下光线追踪器?
    • 非常离题,但我使用的光线追踪器是LuxRender
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多