2016-07-19 17 views
1

でタプルのすべての最初の要素を取得するために、私はそうのようなリストに保存されているすべてのタプルの最初の要素を取得したい:ハスケル、リスト上のパターンマッチング任意の長さ

INPUT   : [(1,2,3), (1,4,5), (1,6,7)] 
Wanted OUTPUT : [(1,1,1)] % Note the tuple notation 

これは私が持っている機能ですこれまでに書かれた:

f [] = [] 
f ((x,y,z):xs) = x:(f xs) 

しかし、それは私にこの出力を与える:

[1,1,1] 

の代わりに、

[(1,1,1)] 

私の誤解はどこですか?

+3

結果は[(Int、Int、Int)]型になりますか? TUPLESの長さは一般的ではありませんので、達成しようとしていることについて二度考えなければなりません。結果がリストになっていればいいですが(ただタプルの存在をユーザに表示したいだけなら)、カッコでリストをきれいに印刷することができます。 – pdexter

+0

検索された出力を作成できないのはなぜですか? *私は特別な何かを達成しようとしていない、私は学習目的のためのパターンマッチングで "周りに遊びたい"だけです。 –

+1

任意の長さのタプルを作成することはできません。 – pdexter

答えて

1

まだ@pdexterのコメントで述べたように、任意の長さのタプルは作成できません。ですから、あなたがしようとしているのは、タプルが3つのインプットを持つタプルと正確にパターンが一致している場合にのみ機能します。私は私が何を意味するか明確にするためにあなたの例をお見せしましょう:

ここ
helper :: [(Int,Int,Int)] -> (Int,Int,Int) 
helper xs = (x,y,z) 
      where [x,y,z] = f xs 

f :: [(Int,Int,Int)] -> [Int] 
f []   = [] 
f ((x,y,z):xs) = x : (f xs) 

我々は[x,y,z]上のパターンマッチングによって(x,y,z)を作成するために管理しますが、以上の3つのタプルがあった場合は、私たちのパターンマッチングは、もはや有効ではないだろうか?

このコードを使って実際に何を達成しようとしているのか、どのようなシナリオが発生する可能性があるのか​​質問してください(例:空のタプル、長さが異なるタプルなど)。あなたのプログラムはこれらの異なるケースを処理しますか?

なぜ出力がタプルであるのが好きなのかという機能的理由がない場合は、そのままにしておくことをお勧めします。

幸運を祈る!

+1

これは非常に役に立ちましたし、今私は本当に最初に述べた問題を理解しています! –

関連する問題