List F#返回列表长度列表

List F#返回列表长度列表,list,f#,combinators,List,F#,Combinators,除了构造函数::和[]之外,我将使用组合器和无for/while循环、递归或F#的列表模块中定义的库函数 理想情况下,我希望实现map 我正在尝试编写一个名为llength的函数,该函数返回子列表的长度列表。例如,llength[[1;2;3];[1;2];[1;2;3]]应该返回[3;2,3]。我还有返回列表长度的函数length let Tuple f = fun a b -> f (a, b) let length l : int = List.fold (Tuple (fs

除了构造函数::和[]之外,我将使用组合器和无for/while循环、递归或F#的列表模块中定义的库函数

理想情况下,我希望实现map

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

let Tuple f = fun a b -> f (a, b)
let length l : int =
    List.fold (Tuple (fst >> (+) 1)) 0 l
目前有

let llength l : int list =
    List.map (length inner list) list

不确定我应该如何使用我的约束访问我的子列表,我应该在每个子列表上使用我的其他方法吗?非常感谢您的帮助,谢谢

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

首先,因为允许使用
折叠
,所以您可以通过
折叠
实现
映射
。折叠函数将获取“至今”累积的列表,并在使用映射函数转换的下一个元素之前加上前缀。虽然结果是相反的(
fold
向前遍历,但您在每一步都要进行预处理),所以如果您不被允许,那么这可能对您不起作用


第二种——最明显、最基本的方法:裸递归。下面是思考它的方法:(1)当参数是一个空列表时,结果应该是一个空列表;(2) 当参数是非空列表时,结果应该是参数头部的长度前置到参数尾部的长度列表,可以递归计算。试着在F#中写下这一点,就会有你的解决方案。

因为你可以使用一些基本上有循环的函数(
fold
filter
…),可能有一些“欺骗和肮脏”的方法来实现
映射。例如,通过
过滤器

let mymap f xs =
    let mutable result = []
    xs
    |> List.filter (fun x ->
        result <- f x :: result
        true)
    |> ignore
    result |> List.rev
让mymap f xs=
让可变结果=[]
xs
|>List.filter(乐趣x->
结果忽略
结果|>List.rev

请注意,
List.rev
是必需的,正如另一个答案中所解释的。

您是否注意到您正在使用
List.fold
?这不是违反规则吗?还有:这是家庭作业吗?如果是,请这样标记。它不允许我添加该标记,并且允许使用一些包含的组合方法,例如偶数、全部、fold、 filterOh,我误读了递归,对不起。好吧,我恐怕你要么需要
折叠
+
rev
,要么
折叠
+
附加
,或者
映射
,或者递归。没办法。我想尝试使用map。我想使用map,我编辑了我的帖子。我走对了吗