Как я могу сделать функцию поиска в ocaml? - PullRequest
0 голосов
/ 21 октября 2019

Мне нужно реализовать функцию find модуля List:

val find : ('a -> bool) -> 'a list -> 'a

Это у меня есть, но я не понимаю тип функции, поэтому яЯ действительно потерян:

let rec find p l= match l with
    []-> raise(Not_found)
    | h::t -> if h=p then p else find p t;;

Это тип моей функции найти:

val find : 'a -> 'a list -> 'a = <fun>

Ответы [ 3 ]

1 голос
/ 21 октября 2019

Проблема, вероятно, в том, что вы неправильно поняли, что find должен был сделать. То, что вы написали, пытается найти p в списке, в то время как find принимает p в качестве предиката, то есть свойства. Вы хотите найти элемент x в списке, удовлетворяющий p, т. Е. Такой, что p x равно true.

0 голосов
/ 21 октября 2019

Если у вас есть список, подобный:

let lst = [10; 1; 9; 2; ]

Тогда ваша находка должна взять такую ​​функцию:

find (fun x -> x = 10) lst

Приведенный выше найдет узел в списке, который равен 10, еслиэто существует.

0 голосов
/ 21 октября 2019

Скажем, у вас есть следующее:

type account = { name : string; amount : int; }
let accounts = [{name = "Musterman"; amount = 10}; {name = "Musterfrau"; amount = -90}]

, затем вы можете найти учетную запись "Musterman", используя:

List.find (fun a -> a.name = "Musterman") accounts

или счета с отрицательным балансом, используя

List.find (fun a -> a.amount < 0) accounts

Наличие первого аргумента List.find, являющегося функцией, возвращающей true при обнаружении элемента списка, делает List.find гораздо более полезным, чем простое сравнение с известным элементом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...