我将使用组合器,并且不使用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
不确定我应该如何使用约束来访问子列表,是否应该在每个子列表上使用其他方法?非常感谢您的帮助!
答案 0 :(得分:6)
由于这是家庭作业,所以我不想只为您提供完整的编码解决方案,但这是一些提示:
首先,因为允许使用map
,所以您可以通过fold
来实现fold
。折叠功能将把列表累积到“到目前为止”,并在下一个通过映射功能转换的元素之前。尽管结果会相反(List.rev
向前移动,但您先行一步),所以如果您不允许removal
,这可能对您不起作用。
第二-最明显的基本方法:裸递归。这是思考的方法:(1)当参数为空列表时,结果应为空列表; (2)当参数是一个非空列表时,结果应为参数头的长度,该长度在参数尾部的长度之前,该参数可以递归计算。尝试用F#写下来,这将为您提供解决方案。
答案 1 :(得分:0)
由于您可以使用一些基本具有循环的功能(fold
,filter
...),因此可能会有一些“欺骗和肮脏”的方式来实现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
是必需的,如其他答案所述。