0

假设我想考虑表单的输入

[int_1, int_2, ..., int_n]
[int_1, int_2, ..., int_m]
...

从文本文件中读取输入。我的目标是获得此列表的最大大小。目前我有一个识别这种模式的正则表达式:

let input = "[1,2,3] [1,2,3,4,5]"
let p = input =~ "(\\[([0-9],)*[0-9]\\])" :: [[String]]

输出:

[["[1,2,3]","[1,2,3]","2,"],["[1,2,3,4,5]","[1,2,3,4,5]","4,"]]

所以我追求的是第三个索引+ 1的最大值。但是,我被困的地方是试图将此索引视为一个整数。例如,我可以很好地引用元素:

(p !! 0) !! 2
> "2,"

但我无法将其转换为 int,我试过了

read( (p !! 0) !! 2)

然而,这不起作用,尽管事实上

:t (p !! 0) !! 2
> (p !! 0) !! 2 :: String

似乎是一个字符串。任何关于为什么我不能将其作为 int 阅读的建议将不胜感激。

再次感谢。

4

1 回答 1

4

我不完全确定您的方法是我推荐的方法,但我正在努力解决目标,所以我将回答这个问题。

问题是read "2,"不能只产生一个 Int,因为有一个剩余的逗号。你可以用reads它来解决这个问题。reads产生一个可能的解析列表和剩下的字符串,所以:

 Prelude> (reads "2,") :: [(Int,String)]
 [(2,",")]

在这种情况下,它是明确的,所以你得到一个解析,然后你可以从中拉出 int,尽管考虑到你未来的自尊心建议是防御性的,而不是假设总会有一个有效的解析(安全模块适用于之类的东西)。

或者,您可以修改您的正则表达式以不在匹配组中包含逗号。

于 2012-07-23T14:32:18.773 回答