2016-11-21 13 views
4

リストを与えれば、そのリストの最初のn要素を返す単純な関数を作成しました。リストの操作

let rec first l n = 
    match l, n with 
    (_, 0) -> l 
    | (x::xs 1) -> [x] 
    | (x::xs n) -> x::(first xs (n-1)) 

しかし、入力がリストではなくリストのリストの場合はどうなりますか?私は、リストのリストを与えられた場合、最初にn要素をリストから返す関数を作りたいと思います。たとえば :

first [[1; 2]; [5; 6; 7]; []; []; [9; 8; 0]] 1 = 
[1; 5; 9] 

私はパターンにリストのリストを作ることによって、アプローチを把握しようとした:

let rec first l n = 
    match l, n with 
    (_, 0) -> l 
    | ([[x]::[xs]], n) -> [x::[first xs (n-1)]] 

それは動作しませんが、私はアプローチについてもっと心配です。それが正しいか?

+1

あなたは何を達成しようとしていますか? –

+0

申し訳ありません@FyodorSoikin、私は問題を指定するのを忘れました。今それは大丈夫でしょう。 – Worice

+1

ここをクリックしてください:https://fsharpforfunandprofit.com/posts/elevated-world/ –

答えて

8

あなたは要素の不十分な番号がリストのいずれかである場合、それは振る舞うしたい方法に応じ

let firsts i = List.map (List.truncate i) 

または

let firsts' i = List.map (List.take i) 

ような機能を実装することができます。

> firsts 2 [[1..10]; [11..20]; [21..30]];; 
val it : int list list = [[1; 2]; [11; 12]; [21; 22]] 
+0

あなたの答えはありがたいことですが、いつものようにすっきりしています。 – Worice