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,"]]

したがって、私が求めているのは、3番目のインデックスの最大値+1です。しかし、私が行き詰まっているのは、このインデックスをintと見なそうとしているところです。たとえば、要素をうまく参照できます。

(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を生成できないことです。これを回避するために使用できますreadsreads可能な解析と残りの文字列のリストを生成するので、次のようになります。

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

この場合、それは明確であるため、intを引き出すことができる1つの解析を取得しますが、将来の自尊心を考慮して、防御的であり、常に有効な解析があるとは想定しないことをお勧めします(Safeモジュールはそのようなこと)。

または、一致したグループにコンマが含まれないように正規表現を変更することもできます。

于 2012-07-23T14:32:18.773 に答える