Ошибка Ocaml перечисляет функцию высшего порядка - PullRequest
0 голосов
/ 25 июня 2018

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

например:

#let f a = if a>8 then true else false;;
pick [1;3;4;9;12;22] f;;
- : int list = [9;12;22]

Я написал этот код, но он не работает:

let rec pick f list =
    let p1 = f list in
        if (List.hd(p1)==true)
            then List.hd(p1)::pick List.tl(p1)
        else pick  List.tl(p1)

Ошибка: это выражение имеет тип 'список но ожидалось выражение типа 'b -> bool #

Как я могу исправить это, чтобы оно работало со списками?

Ответы [ 3 ]

0 голосов
/ 25 июня 2018

Вот некоторые проблемы с вашим кодом.

  • Вы определяете pick f list, но называете его pick [list] f. Убедитесь, что ваш порядок аргументов соответствует. => Это тот, который вызывает сообщение об ошибке.
  • Как сказал Нейт С-К. Вы не можете вызвать f для всего списка, но только для элементов списка.
  • Не используйте List.hd или List.tl, если вы не проверили свой список на пустоту.
  • Не используйте == для структурного равенства, не используйте равенство с логическими значениями.
  • if a>8 then true else false следует заменить просто a>8
0 голосов
/ 26 июня 2018

Модуль List уже содержит решение, это функция filter .

let f a = a > 8;;
List.filter f [1;3;4;9;12;22];;
- : int list = [9;12;22]

Функция выполняет итерации по списку, хранит элементы, проверяющие данный предикат, в аккумуляторе и возвращаетit.

Стандартная библиотека содержит много стандартных методов, таких как filter. Рекомендуется сначала посмотреть документацию, так как большинство этих проблем могут быть решены с помощью этих функций.

Документация Inria длямодуль списка:

https://caml.inria.fr/pub/docs/manual-ocaml/libref/List.html

0 голосов
/ 25 июня 2018

С выражением f list вы передаете список list функции f, а это не то, что вы сказали, что хотели сделать. Вы хотите позвонить f только в начале списка.

Обычно в этой ситуации программист OCaml использует сопоставление с образцом для деконструкции списка, что-то вроде этого (я не тестировал этот код):

let rec pick f list =
  match list with
  | [] -> []
  | h::t -> if f h then h :: pick f t
                   else pick f t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...