2013-09-19 3 views
3

Я пишу функцию, возвращающую список минус третье значение. Вот мой текущий код:Удалить третий элемент в списке F #

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

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

del3 listString 

и я получаю сообщение об ошибке:

Lookup on object of indeterminate type based on information prior to this program point. A type annotation may be needed prior to this program point to constrain the type of the object. This may allow the lookup to be resolved.

Что я должен изменить, чтобы исправить ошибку?

+0

Старайтесь избегать '' .Head' и .Tail'. –

ответ

2

При доступе к членам, методам или свойствам объекта F # должен знать тип этого объекта. Он не может просто вывести тип из того факта, что вы обращаетесь к свойству с именем Head, потому что может быть много разных классов, обладающих таким свойством.

Чтобы устранить эту проблему, дайте listA аннотацию типа или используйте List.head и List.tail вместо свойств.

+0

аннотация типа не помогла .. см. Редактировать – jth41

+0

@ jth41 Это не помогло, потому что аннотация вашего типа (ложно) утверждала, что 'listA' может быть любым типом. Он должен сказать, что 'listA' - это список. – sepp2k

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 
+0

Ваш второй случай сопоставления является избыточным, поскольку это особый случай первого для 'tail = []'. –

+1

Ах да, хорошая точка –

16

Я думаю, что более простой подход, основанный на шаблоне сопоставляются может быть лучше

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

+1 Совместимость шаблонов просто прекрасна :-) –

Смежные вопросы