删除F#列表中的第三个元素

时间:2013-09-19 22:48:50

标签: f#

我正在编写一个函数来返回一个减去第三个值的列表。 这是我目前的代码:

let listString = [ "1"; "2"; "3"; "4" ];;

let del3 (listA :'a)  =  [listA.Head; listA.Tail.Head] @ [listA.Tail.Tail.Tail];;

del3 listString

我收到错误:

  

根据此程序点之前的信息查找不确定类型的对象。在此程序点之前可能需要类型注释来约束对象的类型。这可能允许解析查找。

我应该更改什么来修复错误?

3 个答案:

答案 0 :(得分:16)

我认为基于模式匹配的简单方法可能更好

let del3 = function |a::b::c::d -> a::b::d | _ -> failwith "insufficient input"

答案 1 :(得分:7)

您需要让编译器知道listA是一个列表。 Tail还会返回一个列表,因此对于第二个列表,您要附加的内容不要将尾部包裹在列表中,否则您将会有一个列表列表:

let listString = [ "1"; "2"; "3"; "4" ]

let del3 (listA :'a list)  =  [listA.Head; listA.Tail.Head] @ listA.Tail.Tail.Tail

del3 listString;;

处理所有尺寸列表的解决方案:

let del3 = function
    | a::b::c::tail -> a::b::tail
    | list -> list

答案 2 :(得分:2)

当访问对象的成员,方法或属性时,F#需要知道该对象的类型。它不能仅仅从您访问名为Head的属性的事实推断出类型,因为可能有许多不同的类具有这样的属性。

要解决此问题,请为listA提供类型注释,或使用List.headList.tail代替属性。