F#返回列表长度列表

phi*_*idt 2 f# list combinators

我将使用组合器,而不是来自F#的List模块的/ while循环,递归或定义的库函数,除了constructors ::和[]

理想情况下,我想实现地图

我正在尝试编写一个名为llength的函数,它返回子列表的长度列表.例如llength [[1; 2; 3]; [1; 2]; [1; 2; 3]]应返回[3; 2,3].我还有函数长度,返回列表的长度.

let Tuple f = fun a b -> f (a, b)
let length l : int =
    List.fold (Tuple (fst >> (+) 1)) 0 l
Run Code Online (Sandbox Code Playgroud)

目前有

let llength l : int list =
    List.map (length inner list) list
Run Code Online (Sandbox Code Playgroud)

不知道我应该如何尝试使用我的约束来访问我的子列表,我应该在每个子列表中使用我的其他方法吗?非常感谢任何帮助,谢谢!

Fyo*_*kin 6

由于这是家庭作业,我不想只给你一个完全编码的解决方案,但这里有一些提示:

首先,因为fold允许你可以实现mapvia fold.折叠函数将获取"到目前为止"累积的列表,并在前面添加使用映射函数转换的元素.结果会反过来(fold向前移动,但是你在每一步都是前置的),所以如果你不允许的话,这可能对你不起作用List.rev.

第二 - 最明显,最根本的方式:裸体递归.这是考虑它的方法:(1)当参数是一个空列表时,结果应该是一个空列表; (2)当参数是非空列表时,结果应该是参数头部的长度,前面是参数尾部的长度列表,可以递归计算.尝试用F#写下来,这将是你的解决方案.