List 从列表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

我正在尝试用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 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是的,那更好