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#第三方图书馆创建了差异列表,但我找不到。兴趣:兴趣:如果你要上课,问问你的老师,看看会发生什么。