2009-05-18 14 views

答えて

6

次のコードは、仕事を行います。

map head [[1,2,3],[4,5,6]] 

mapはHaskellの中で最も便利な機能(および他の関数型プログラミング言語)の一つです。リスト[a,b,c,d]と関数fが与えられた場合、map f [a,b,c,d]はリスト[f a, f b, f c, f d]を返します。 head関数は、リストの最初の要素を抽出します。これは、一般的に、なぜ

map head [[1,2,3],[4,5,6]] -> 
[head [1,2,3], head [4,5,6]] -> 
[1,4] 
6

もっとです:

col :: Int -> [[a]] -> [a] 
col n = map (head . drop n) 

nがより大きいか、あなたがそれを与えるリストのいずれかの長さに等しい場合、これは失敗することに注意してください。

+5

これに相当する 'col n = map(!! n)'は、意図を少しはっきりと伝えると思います。 YMMV。 – ephemient

1

次のコードは、仕事をする:ヨナス答えに拡大すること

map head [[1,2,3],[4,5,6]] 

mapは、リストの各要素に関数を適用します。関数をリストに「マッピング」すると、別のタイプの新しいリストになります。

ここに入力したリストのタイプは[[Int]]です。つまり、リスト内の各要素はIntのリストです。したがって、各サブリストを取得して最初の要素を返す関数が必要です。つまり、headです。

mapは、機能headを取るあなたは、各リストのちょうど先頭(最初の要素)を含むタイプ[Int]の新しいリストを取得するように、サブリストのそれぞれに適用されます、総括します。

2

行の行列を列の行列に変換するライブラリ関数は、Data.List.transposeです。だからあなたの問題を解決する一つの方法は、

import Data.List (transpose) 
col = head . transpose 

でまた行列から任意の列を取得する関数を書くことができます:

colN n matrix = transpose matrix !! n 

免責事項:

をあなたが必要な場合は、転置が高価であることを忘れないでください行列全体を転置する。最初の列については、他のソリューションが提供しているのとほぼ同じコストでなければなりません。

また、転置は、その結果が引数と同じ型:[[a]] -> [[a]]であるため、複雑なコードでは比較的危険です。だから間違った数の転置をするのは簡単です。 (私はこれを難しい方法で学びました)。

関連する問題