Как я могу использовать [x] в Ocaml? - PullRequest
4 голосов
/ 22 декабря 2011

например: когда я хочу составить список целых чисел: [1, 2, 3] с x, мой код:

[1, 2, 3] @ [x]

но в другом случае у меня есть функция, которая принимает список в качестве аргумента,

val foo : int list

У меня есть другая функция print_foo, принимающая foo в качестве аргумента, и тип возвращаемого значения

val print_foo : int list list

Я пишу функцию: print_foo [foo]

Мой вопрос таков: [foo] в этом случае принимается проверкой типа, но правильно ли это в логическом смысле?Какой хороший способ написать эту функцию?Это тот же вопрос для [[x]]

Не могли бы вы объяснить, как и когда я могу использовать [x] или [[x]] и т. Д.? *

Спасибоочень много,

Ответы [ 3 ]

3 голосов
/ 22 декабря 2011

[x] означает список, содержащий один элемент: x.

[[x]] означает список, содержащий один элемент: список, содержащий один элемент: x.

Итак, если вы скажете, x - это 4, тогда [x] = [4] - это список, содержащий только 4, а [[x]] = [[4]] - это список, содержащий только список, содержащий только 4.

Как видите, [x] просто помещает x в список сам по себе. Если x = [1, 2, 3] (то есть x - это сам список), то вы, вероятно, не хотите вызывать функцию с [x] (= [[1, 2, 3]]), поскольку затем вы предоставляете ей список, содержащий ваш исходный список, а не сам список. , Конечно, это может быть вполне законным и необходимым в некоторых случаях, но если вы не уверены, это, скорее всего, не нужно.

Итак, если у вас есть foo, то есть int list, и вы затем звоните print_foo [foo], вы говорите: «Распечатайте этот список, содержащий список, который я хочу напечатать». Что вы, вероятно, хотите сказать, это print_foo foo, где вы пропускаете избыточную оболочку списка. Это можно интерпретировать как «Распечатать этот список, который я хочу напечатать».

3 голосов
/ 22 декабря 2011

Всегда проще, когда у вас есть типы:

int list - это список, содержащий целые числа:

# let x = [1;2;3];;
val x : int list = [1;2;3]
# List.hd x;; (* return the first element of x *)
- : int = 1

int list list - это список, содержащий int list:

# let y = [x;[4;5]];;
val y : int list list = [[1;2;3];[4;5]]
# List.hd y;; (* return the first element of y *)
- : int list = [1;2;3]

и т. Д.

Кроме того, если вы хотите объединить список целых чисел [1;2;3] со списком целых чисел x, вы должны использовать:

[1;2;3] @ x

как @ имеет тип 'a list -> 'a list -> 'a list, т.е.он принимает два списка одного типа и возвращает новый список того же типа.

1 голос
/ 22 декабря 2011

int list list - это фактически (int list) list, которое может быть выражено как [an_int_list, another_int_list] или просто [the_single_element_which_is_an_int_list]. Так что foo - это int list, поэтому [foo] - это просто список int list, который (int list) list.

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