我正在编写一个函数来返回一个减去第三个值的列表。 这是我目前的代码:
let listString = [ "1"; "2"; "3"; "4" ];;
let del3 (listA :'a) = [listA.Head; listA.Tail.Head] @ [listA.Tail.Tail.Tail];;
del3 listString
我收到错误:
根据此程序点之前的信息查找不确定类型的对象。在此程序点之前可能需要类型注释来约束对象的类型。这可能允许解析查找。
我应该更改什么来修复错误?
答案 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.head
和List.tail
代替属性。