2016-03-24 17 views
2

リスト(xs)を3つの部分に分割して出力するこの関数定義に出くわしました。Haskell - リストを3つの部分に分割するTakeとDropの使用

事はわかりにくいです。私はリストの長さ(xs)を3で割ったものとしてnが定義されているリスト(xs)のnを取る最初の部分を理解する。しかしその後、何が起きているのか分からない。

誰かがこの機能を利用して私を歩くことができれば素晴らしいだろう。ここ

コードがある:

--SPLITS A LIST INTO THREE PARTS--------------------------------------------------------- 

split3 xs = (take n xs , take n (drop n xs) , drop (n*2) xs) 
    where n = length xs `div` 3 

答えて

5

第二の部分は第一n要素をドロップし、次n要素をとります。

[------- n -------][------- n -------][------- n -------] 
^    ^
dropped   taken by `take` ^dropped by `take` 

具体例[1,2,3]n == 1のリストとすることができます。

take n (drop n xs) 
== take 1 (drop 1 [1,2,3]) 
== take 1 [2,3] 
== 2 

第三部では、私は、私はまだ理解していないごめんなさい[1,2,3]のあなたの例では、あなたがドロップ二回nを落とし、残り

[----    2n   -----][---- n -----] 
^         ^
dropped        taken by `drop` 
+0

を取ります1をリストから取り出し、そのリストから1を取ります。私はその仕組みが分からない。それは、リストから第1の要素を取ったり、リストから1つの要素を取って小文字にすることを意味しますか?また、行に== 1を取る[2,3]なぜ結果はちょうど2ですか? –

+0

また、この文章の詳細な説明もあります。「2番目の部分は最初のn個の要素を削除し、次のn個の要素を取ります。それは私を本当に混乱させています。 –

+0

@ GR412 'take 1'は要素' 1'ではなく要素の先頭から1つを取る関数です! 'take '[' a '、' b '、' c] == ['a'、 'b']'を考えてみましょう。したがって、文章は単に、その場合の 'take 'が、元のリストを取り出して' n'最初の要素をそのリストから削除したときに取得するリスト上で呼び出されることを意味します。しかし残りの "tail"は2n要素、2番目の1/3、3番目の1/3なので、nを取ることで実際の中間部分が得られます。 –

関連する問題