2014-01-14 2 views
0

Я начинаю изучать f # с нуля, и я нахожу себя в замешательстве с разницей между массивами и списками, я знаю, что списки неизменны, но все же.F # добавление элемента в список, если он не существует

Я пытаюсь создать функцию, которая добавляет элемент в список, если он не существует и возвращает новый список, иначе, если он существует, возвращает текущий список.

Вот что я до сих пор:

let elem x= Array.exists ((=) x) 
let elemOrAdd e l = if elem e l then l else e::l 

е :: л не работает, визуальная студия бросает

This expression was expected to have type 
    'a []  
but here has type 
    'b list 

Я уже нахожу это немного подозрительным, что я должен используйте этот Array.exists, но я действительно не в порядке.

Любые подсказки о том, что я делаю неправильно?

ответ

2

Использование Array.exists дает вашей elem функция подписи x:'a -> ('a [] -> bool), которая влияет на определение elemOrAdd предполагая l тип выводится массив, но используется в качестве списка. Изменение параметра elem на let elem x= List.exists ((=) x) устранит проблему.

+0

Да, это было. Но все же различие между массивом и списком меня смущает. –

+0

Вкратце ['array'] (http://msdn.microsoft.com/en-us/library/dd233214.aspx) является ** изменяемой ** сборкой фиксированного размера с операторами' .' и '[]' для прямого доступа к любому элементу, тогда как ['list'] (http://msdn.microsoft.com/en-us/library/dd233224.aspx) является ** неизменяемой ** коллекцией с операторами' :: 'и' @ ' , допускающий только последовательный доступ к элементам. –

1

В F # тип array - тип System.Array, который вы, возможно, помните на таких языках, как C#. Тип list является неизменным single-linked list, который является частью FSharp.Core.

Когда вы использовали Array.exists в вашей elem функции компилятор сделал вывод, что функция ожидает array типов, компилятор затем сделать вывод, что ваша elemOrAdd функции также ожидает array типов. Это объясняет, почему, когда вы использовали :: для присоединения элемента к list, компилятор пожаловался. Оператор :: работает только с типами list.

Изменение в использовании List.exists в вашей функции elem исправит это.

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