列表列表上的操作

Wor*_*ice 4 f# list

我构建了一个简单的函数,给定一个列表,返回该列表的第一个n元素.

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

但是,如果输入是列表而不是列表,该怎么办?我想构建一个函数,给定列表列表,返回每个列表中的第一个n元素.例如:

first [[1; 2]; [5; 6; 7]; []; []; [9; 8; 0]] 1 = 
[1; 5; 9]
Run Code Online (Sandbox Code Playgroud)

我试图通过使模式成为列表列表来找出一种方法:

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

它不起作用,但我更关心这种方法.这是对的吗?

Mar*_*ann 8

你可以实现这样的功能

let firsts i = List.map (List.truncate i)
Run Code Online (Sandbox Code Playgroud)

要么

let firsts' i = List.map (List.take i)
Run Code Online (Sandbox Code Playgroud)

取决于如果其中一个列表中的元素数量不足,您的行为方式如何.

> firsts 2 [[1..10]; [11..20]; [21..30]];;
val it : int list list = [[1; 2]; [11; 12]; [21; 22]]
Run Code Online (Sandbox Code Playgroud)