List 从列表F中删除每三个元素#
我正在尝试用F#编写一个模块,它将从列表中删除每三个元素,并返回一个没有这些元素的新列表 比如说List 从列表F中删除每三个元素#,list,f#,List,F#,我正在尝试用F#编写一个模块,它将从列表中删除每三个元素,并返回一个没有这些元素的新列表 比如说 let input = [ 1 .. 15 ] printfn "List with elements eliminated: %A" (Program1.remove input) 哪一个应该给出这个输出 List with elements eliminated: [1; 2; 4; 5; 7; 8; 10; 11; 13; 14] 到目前为止我试过什么 module Program
let input = [ 1 .. 15 ]
printfn "List with elements eliminated: %A" (Program1.remove input)
哪一个应该给出这个输出
List with elements eliminated: [1; 2; 4; 5; 7; 8; 10; 11; 13; 14]
到目前为止我试过什么
module Program1 =
open System
let remove list1=
let collectList = List.iteri (fun i x -> if i%3 <> 0 then x) list1
collectList
[<EntryPoint>]
let main argv =
let list = [ 1; 2; 3]
printfn "new List is %A" (Program1.remove list )
0
模块编程1=
开放系统
让我们删除列表1=
让collectList=List.iteri(乐趣i x->如果i%3 0那么x)列表1
收藏品清单
[]
让主argv=
让列表=[1;2;3]
printfn“新列表为%A”(Program1.remove List)
0
现在我遇到了一个错误,我一整天都在试图解决它。
对于此错误,请提前向您表示感谢:
error FS0001: Type mismatch. Expecting a
'unit list'
but given a
'int list'
The type 'unit' does not match the type 'int'
问题来自行如果i%3 0那么x
。它是一个没有else子句的if表达式,并且它必须具有单元的类型
,并且类型推断会导致x
成为类型单元
。有关F#条件句的更多详细信息,请阅读
编辑:另外,List.iteri
不会执行您想要执行的操作,因为List.iteri
不会返回列表,而是返回一个单元。您需要诸如List.map
、List.filter
、List.choose
、List.foldBack等函数来解决问题
阅读此帖子中的公认答案,了解如何解决此问题(您需要做一些小修改):
还有一种更简单的方法是使用List.foldBack
构建结果列表。我不确定您是否尝试过滤每三个值或每一个可除以3的值
如果这是第一种情况,那么不止一种功能性方法可能是这样
//safe take and skip fn (no exceptions)
let take x xs = if List.length xs >= x then List.take x xs else []
let skip x xs = if List.length xs >= x then List.skip x xs else []
let rec remove x xs =
//effectively this drops every xnt element
let head = take (x - 1) xs
let tail = skip x xs
match tail with
| [] -> head
| _ -> List.append head (remove x tail)
let x = ["One";"Two";"Three";"Four";"Five";"Six";"Seven";"Eight";"Nine";"Ten"]
remove 3 x
然而,这是相当重的重量;-)
因此,一个更好的方法可能是您几乎已经发现的方法
let x = ["One";"Two";"Three";"Four";"Five";"Six";"Seven";"Eight";"Nine";"Ten"]
let indices = [1 .. List.length x]
List.zip indices x
|> List.filter (fun (x,_) -> x % 3 <> 0)
设x=[“一”;“二”;“三”;“四”;“五”;“六”;“七”;“八”;“九”;“十”]
让索引=[1..List.length x]
List.zip索引x
|>List.filter(乐趣(x,)->x%3 0)
您收到了什么错误消息?这里有一些递归方法的提示:也许可以添加一点关于List.iteri
也返回unit
的事实。另外,尽管链接的答案是正确的,但这里(那里)也可以使用List.foldBack
let List=[1..15]
let r1=List.filter(fun x->x%30)List
printfn“新列表是%a”r1
这是我的最终解决方案。谢谢你的提示。我的问题是,我试图删除每种类型的列表的每一个trird元素,但在我的情况下,我总是有一个升序列表,这样就可以很容易地使用list.filter完成。谢谢你别忘了在最后只获取项目,因为F#4.0有List.indexed
,它返回一个项目列表,并与它们的索引进行元组化,你可以重写它x |>List.indexed |>List.filter(有趣(i,|)->i%3 0)|>List.map snd
@Sehnsucht是的,那更好