2

昨年の古い中間問題を解決しようとしていますが、これには多くの問題があります。

リスト内包表記を使用して、次の型の関数を実装します。

collectSecond :: [[Int]] -> [Int]

そのような (collectSecond xs) は、長さが 2 未満のリスト メンバーを除いて、xs のリスト メンバーの 2 番目の要素を含むリストを返します。例えば:

collectSecond [[1,2,3], [4], [], [5,6]] ~> [2,6]
collectSecond [[1], [], [2]] ~> []
collectSecond [] ~> []

これについての助けをいただければ幸いです。

4

2 に答える 2

4

次のように、リスト内包表記でパターン マッチングを使用して 2 番目の要素を取得できます。

collectSecond xs = [x2 |  x1:x2:rest <-  xs]

ここで、x2 は、xs に含まれる各リストの 2 番目の要素に一致します (存在する場合)。

Prelude> collectSecond [[1,2,3], [4], [], [5,6]]
[2,6]

2 番目の要素がない場合、そのサブリストのリストには要素が追加されません。たとえば、上記の例の [4] と [] を参照してください。

于 2013-02-22T03:48:26.830 に答える
1

基本的な再帰を使用して実装するのも非常に簡単です。

collectSecond ((x0:x1:_):ys) = x1:(collectSecond ys)
collectSecond (_:ys)         = collectSecond ys
collectSecond []             = []

(ここでは、各要素を個別に処理し、その秒要素が存在する場合は作成中のリストに追加し、秒要素がない場合はスキップします)

次を使用することもできますconcatMap

collectSecond xs = concatMap seconds xs
    where seconds (x0:x1:_) = [x1]
          seconds _         = []
于 2013-02-22T18:41:18.350 に答える