3

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

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

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

del3 listString

我得到了错误:

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

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

4

3 回答 3

16

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

let del3 = function |a::b::c::d -> a::b::d | _ -> failwith "insufficient input"
于 2013-09-19T23:17:41.490 回答
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
于 2013-09-19T23:16:26.153 回答
2

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

要解决此问题,请提供listA类型注释或使用List.headandList.tail而不是属性。

于 2013-09-19T22:58:58.357 回答