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
, когда ни один из них не содержит значения.
Надеюсь, это поможет.