List F#返回列表长度列表
除了构造函数::和[]之外,我将使用组合器和无for/while循环、递归或F#的列表模块中定义的库函数 理想情况下,我希望实现map 我正在尝试编写一个名为llength的函数,该函数返回子列表的长度列表。例如,llength[[1;2;3];[1;2];[1;2;3]]应该返回[3;2,3]。我还有返回列表长度的函数lengthList 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
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,我编辑了我的帖子。我走对了吗