0

このようなリストがあると仮定します

let a =[["Warning:","Route","1543","must","Stop","on","Link","11881"],["Warning:","Route","1578","must","Stop","on","Link","12171"]]

そして、その中の各リストの3番目の要素を抽出したい、つまり結果を次のように取得したい["1543","1578"]

それを取得するために次のコードを書きましたが、機能していません。

foldr (\acc x -> (x !! 2):acc) [] a
4

2 に答える 2

3

リスト内包表記パターンマッチングを使用して、やりたいことを安全に行う方法は次のとおりです。

let a' = [x | (_:(_:(x:_))) <- a]

これにより、リストが繰り返され、a少なくとも長さのすべてのサブリストが調べられ、3そのような各サブリストの3番目の要素が返されます。

このソリューションは、長さが。未満のサブリストを黙って無視し3ます。これを回避し、ある程度の柔軟性を得るにはMaybe、return型で使用する関数を記述します。リストに3番目の要素がある場合は、3Just番目の要素を返します。それ以外の場合は、を返しNothingます。

takeThird :: [a] -> Maybe a
takeThird (_:(_:(x:_))) = Just x
takeThird _             = Nothing

次に、リスト内包表記を使用して、操作の安全なバージョンを記述できます。

let safea = [takeThird x | x <- a]

そしてそこから、要素を削除する可能性のあるバージョンを作成できます。

let maybedropa = [x | Just x <- safea]
于 2012-12-31T16:36:10.290 に答える
0

最近のレンズライブラリ (Control.lens)を使用した代替ソリューションは次のようになります。

import Control.Lens
>a^..traverse.(element 2)
["1543","1578"]

中置記法を使用しない場合:

>toListOf (traverse.(element 2)) a
["1543","1578"]

'traverse' は traversable の各要素 (この場合はリスト) にアクセスし、(要素 2) インデックス 2 を持つ要素を取得し、toListOf はそれをすべてリストに収集します。この方法には、後でデータ構造を複雑にすることに決めた場合に、独自のレンズ インターフェイスがまだない場合は、それを書き込むだけでよいという利点があります。

[[String]] の代わりに [[(Annotation, String)]] があり、上記のように String 部分が必要だとします。あとは、_2 タプル アクセサーを追加するだけです。

a^..traverse.(element 2)._2
于 2013-01-02T22:23:39.053 に答える