2016-11-21 35 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