构造一个 N*N 元素的子列表列表

Consctruct a list of sublists of N*N elements

我正在尝试仅使用 List.map、List.filters 匿名函数[=27] 在 ocaml 中构建列表=]

我想得到的是:

- : int list list = [[2; 2]; [5; 5; 5; 5; 5]; [7; 7; 7; 7; 7; 7; 7]; [3; 3; 3];
2
[12; 12; 12; 12; 12; 12; 12; 12; 12; 12; 12; 12]; [4; 4; 4; 4]; ... ]

来自这个列表

let entiers = [2; 5; 7; 3; 12; 4; 9; 2; 11];;

到目前为止我尝试过的:

List.map (fun n acc -> acc = n if acc = 0 then [] else n :: fun n acc -1 ) entiers;;

但是我遇到语法错误,所以有点卡住了...

有人可以帮我解决这个问题吗? 谢谢!

正如@ChristopheRiolo 评论的那样,您似乎在尝试定义一个递归的匿名函数。这非常困难,因为您确实需要函数的名称才能递归调用自身。

特别是,它看起来像这个片段:

fun n (acc - 1)

旨在作为递归调用。但是,这根本不是函数调用,而是新(内部)匿名函数定义的开始。 (这是语法错误的来源,因为它不是有效的 lambda 定义。)

如果您将要映射的函数定义为调用 map 之外的具有名称的函数,效果会更好。

大致是这样的:

let rec helper n =
    if n = 0 then [] else n :: helper (n - 1)
in
List.map helper ...

(这个 helper 的定义可能不正确;我只是想展示您可能想要使用的总体布局。)