2017-05-09 3 views
0

せずに、すべてのリストの最初の要素を区切ることができます。 Haskellではリストの私のリストです:リスト - どのように私は、例えばマップ

[[1,2,3]、[7,6 、8]、[0,3,4]]

私はリストにerveryリストのすべての最初の要素が必要です。

出力[1,7,4]を「地図」なしで取得するにはどうすればよいですか? 私は、パターンマッチングと解決策ではなく、この必要があります。maphead関数の定義で リストのx =マップヘッドX

+0

ヒント:ネストできるパターン。ペアのリストがあるなら、 'f((a、b):xs)= ...'を使うことができます。リストのリストについては、同様のパターンを使います( ':'を2回使うことができます)。すべての可能性のあるケースを捉えてください。 – chi

答えて

2

ルック。そして、実装をコピーして、両方の機能を1つにまとめます。それを簡単にするには、mapを置き換えて、mapに渡した関数をheadとし、独自のheadを使用してください。 case <expr> of ...式を使用すると、自分の頭を別の関数として実装することはできません。これらすべてのことをやった後、おそらくあなたの機能をよりエレガントにするためにリファクタリングすることができます。

+0

ありがとう!やってみます! ^^ – programmer

0

私はハスケルに新しいですが、これは私がここで作成することができたものです。

リストの理解とパターンマッチングを使用しました。

--Type definition. Not mandatory but recommended. 
firstItemOfEveryList :: [[a]] -> [a] 
--First pattern. If the list is empty return a empty list. 
firstItemOfEveryList [] = [] 
--Catch all pattern. Receive a list of lists (xxs). For every inner list (xs <- xxs) call the head method (head xs), but only when the inner list is not null or empty (not(null xs). 
firstItemOfEveryList xxs = [head xs | xs <- xxs, not(null xs)] 

空のリストパターンは、最後のキャッチと同じ結果が得られるので、少し不必要です。それが役に立てば幸い。

+0

非常に良い!私はハスケルのノブです。あなたは私にその部分を説明できますか?/ = [] "これはヘルプ機能ですか?このコメントを新しい関数に書くことはできますか? – programmer

+0

これは単なる検証です。現在の内部リストが空でないかどうかをチェックしています。リストが空の場合、headがエラーをスローするからです。この検証を分離した関数に入れたい場合は、次のようなことができます: 'firstItemOfEveryList xxs = [head xs | xs = -Xxs、validateList xs] validateList x = x/= [] '、またはグローバルスコープ内の別の関数を宣言してください。 –

+1

あなたは_those_制約を必要とせず、' Eq a'だけを使うべきです。また、 'xs/= []'を 'not(null xs)'で置き換えれば、それは必要ありません。 –

1
firsts [] = [] 
firsts [(x:xs)] = [x] 
firsts ((x:xs):xss) = x: firsts xss 


> firsts [[1,2,3], [7,6,8], [0,3,4]] 
[1,7,0] 
+0

パターンを使用して内部リストに空のリスト検証を追加する方法はありますか?私はそうすることはできませんでした。 –

+1

最初の要素がないので失敗するはずです。空のサブリストを無視したい場合、その 'firsts [[]] = []'のためのプロビジョニングを追加することができます – karakfa

1

ネストされたパターンマッチングを使用して別の答え:

firsts :: [[a]] -> [a] 
firsts  []  = [] 
firsts ([]:xss) = error "sublist is empty" 
firsts ((x:xs):xss) = x:firsts xss 
関連する問題