Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 编辑列表的F#函数_List_F# - Fatal编程技术网

List 编辑列表的F#函数

List 编辑列表的F#函数,list,f#,List,F#,我试图实现一个函数,该函数接受一个元素和一个列表,并删除所述元素 这不会产生输出,我不知道为什么。我是F#的新手,所以很可能我犯了一个基本的错误。请注意,我正试图使用递归来实现这一点 我不知道你的问题的目的是什么,它是真的删除还是在列表上编写递归函数 要实现您的目标,最简单的方法是: let remove item lst = List.filter (fun x -> x <> item) let remove item lst=List.filter(乐趣x->x项)

我试图实现一个函数,该函数接受一个元素和一个列表,并删除所述元素


这不会产生输出,我不知道为什么。我是F#的新手,所以很可能我犯了一个基本的错误。请注意,我正试图使用递归来实现这一点

我不知道你的问题的目的是什么,它是真的删除还是在列表上编写递归函数

要实现您的目标,最简单的方法是:

let remove item lst = List.filter (fun x -> x <> item)
let remove item lst=List.filter(乐趣x->x项)
也就是说:过滤掉所有与项目相等的元素

这有用吗?

试试这个

let rec remove item lst =
    let rec removeInner item lst acc =
       match lst with
       | h::tl when item = h -> removeInner item tl acc
       | h::tl -> removeInner item tl (h::acc)
       | []    -> List.rev(acc)
    removeInner item lst []

[<EntryPoint>]
let main argv = 

    let result = remove 2 [1;2;2;3;4;2]
    printfn "%A" result

    0
它的内容是:当列表为空时,返回一个空列表

您需要做的是累积未删除的值,并返回累积值作为结果

使用带有F#的累加器对于起动机来说是典型的,并且是用这条线创建的

removeInner item lst []
末尾的
[]
是累加器,它是一个空列表,因为您没有添加任何内容

然后,当你前进时,用这一行添加到它

| []    -> []
| h::tl -> removeInner item tl (h::acc)
| []    -> List.rev(acc)
最后,将累加器中的值倒过来,并用此行返回它

| []    -> []
| h::tl -> removeInner item tl (h::acc)
| []    -> List.rev(acc)

这只是一个坐在那里等待调用的函数。您需要使用类似于
remove(3,[1..5])
的方式调用它。当我尝试这样调用它时,会得到“终端进程终止,退出代码为:1”。我不知道如何修复它。它是递归的,因为您在函数中再次调用它。但是我发现了一个可能导致进程终止的错误,因为堆栈溢出:在匹配表达式的中间情况下,它应该是代码>删除(项目,TL)< /代码>。您当前正在再次传递原始列表,这导致递归永远不会终止。对于所有问题,您知道为什么它只删除元素的第一次迭代吗?例如,如果我运行remove(2[1;2;3;2;4]),函数将在返回[1;3;2;4]时返回[1;3;4],您也可以向上投票接受的答案。:)你可以用。本质上,每次调用都递归地传递一个函数,在返回递归的过程中,函数被调用,并将项追加到列表中。由于项目以正确的顺序附加到列表中,因此无需反转它们。有点先进,但你可以做到。有趣的是,我刚才回答了一些类似的问题,但是使用Prolog,你不会传递一个函数,而是传递一个。你可以使用list append操作符,但是在列表的末尾追加是没有效率的。其中一个F#第三方图书馆创建了差异列表,但我找不到。兴趣:兴趣:如果你要上课,问问你的老师,看看会发生什么。