F#返回列表长度的列表

时间:2018-11-05 15:36:33

标签: list f# combinators

我将使用组合器,并且不使用F#的List模块中的for / while循环,递归或已定义的库函数,除了构造函数::和[]

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

我正在尝试编写一个名为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

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

2 个答案:

答案 0 :(得分:6)

由于这是家庭作业,所以我不想只为您提供完整的编码解决方案,但这是一些提示:

首先,因为允许使用map,所以您可以通过fold来实现fold。折叠功能将把列表累积到“到目前为止”,并在下一个通过映射功能转换的元素之前。尽管结果会相反(List.rev向前移动,但您先行一步),所以如果您不允许removal,这可能对您不起作用。

第二-最明显的基本方法:裸递归。这是思考的方法:(1)当参数为空列表时,结果应为空列表; (2)当参数是一个非空列表时,结果应为参数头的长度,该长度在参数尾部的长度之前,该参数可以递归计算。尝试用F#写下来,这将为您提供解决方案。

答案 1 :(得分:0)

由于您可以使用一些基本具有循环的功能(foldfilter ...),因此可能会有一些“欺骗和肮脏”的方式来实现map。例如,通过filter

let mymap f xs =
    let mutable result = []
    xs
    |> List.filter (fun x ->
        result <- f x :: result
        true)
    |> ignore
    result |> List.rev

请注意,List.rev是必需的,如其他答案所述。