OCaml возвращает значение в если оператор вложен в цикл - PullRequest
0 голосов
/ 15 сентября 2018

Я пытаюсь вернуть значение, если что-то происходит при переборе списка. Можно ли вернуть строку, если X происходит при итерации по списку, в противном случае вернуть другую строку, если этого не произойдет?

let f elem =
  if not String.contains str elem then "false" in
List.iter f alphlist;

"true";

Это не работает в моем реализованном методе, к сожалению.

1 Ответ

0 голосов
/ 15 сентября 2018

OCaml - это функциональный язык, поэтому вам нужно сосредоточиться на значениях, возвращаемых функциями.Существуют способы вернуть разные значения в исключительных случаях, но (ИМХО) лучший способ научиться - начинать с обычных вызовов старых вложенных функций.

List.iter всегда возвращает одно и то же значение: (),который известен как unit.

. По этой причине выражение List.iter f alphlist также всегда будет возвращать () независимо от того, что делает f.

Существует другой вид списка-обработка функции, которая работает, поддерживая значение во всех вызовах и возвращая это значение в конце.Это называется сгибом.

Итак, если вы хотите вычислить какое-то значение, которое является своего рода сводкой того, что он видел во всех списках строк в alphlist, вам, вероятно, следует использовать сгиб, скажем List.fold_left.

Вот функция any_has_7, которая определяет, содержит ли какой-либо из указанных списков целое число 7:

let any_has_7 lists =
    let has_7 sofar list =
        sofar || List.mem 7 list
    in
    List.fold_left has_7 false lists

Вот как это выглядит при запуске:

# any_has_7 [[1;2]; [3;4]];;
- : bool = false
# any_has_7 [[1;2]; [5;7]; [8;9]];;
- : bool = true

Другими словами, эта функция во многом похожа на то, что вы просите.Он возвращает true, когда один или несколько списков содержат определенное значение, и false, когда ни один из них не содержит значения.

Надеюсь, это поможет.

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