Ваш вопрос немного запутан - вам нужна функция, которая возвращает все значения в списке.Ну, самый простой способ вернуть переменное число значений - использовать список!Возможно, вы пытаетесь эмулировать генераторы Python?OCaml не имеет ничего похожего на yield
, но вместо этого обычно выполняет то же самое, «передавая» значение функции (используя iter
, fold
или map
).
Что выв настоящее время написано эквивалентно этому в Python:
def elements(list):
if(len(list) == 0):
return []
else:
list[0]
return elements(list[1:])
Если вы пытаетесь сделать это:
def elements(list):
if(len(list) > 0):
yield list[0]
# this part is pretty silly but elements returns a generator
for e in elements(list[1:]):
yield e
for x in elements([1,2,3,4,5]):
dosomething(x)
Эквивалент в OCaml будет выглядеть так:
List.iter dosomething [1;2;3;4;5]
Если вы пытаетесь определить, является ли список a подмножеством списка b (как я понял из ваших комментариев), тогда вы можете воспользоваться List.mem
и List.for_all
:
List.for_all (fun x -> List.mem x b) a
fun x -> List.mem x b
определяет функцию, которая возвращает true, если значение x равно любому элементу в (является членом) b.List.for_all
принимает функцию, которая возвращает bool (в нашем случае, функцию членства, которую мы только что определили) и список.Эта функция применяется к каждому элементу в списке.Если эта функция возвращает true для каждого значения в списке, то for_all
возвращает true.
Итак, что мы сделали: для всех элементов в a проверьте, не являются ли они членами b.Если вы заинтересованы в том, как написать эти функции самостоятельно, я предлагаю прочитать исходный файл list.ml, который (при условии * nix), вероятно, находится в / usr / local / lib / ocaml или /usr/lib/ocaml.