Дополнительный аргумент не может быть стерт?

Я просто использую Vim или jEdit. Пролог как язык действительно не предоставляет себя сильной поддержке IDE. С одной стороны, это с динамическим контролем типов, который бросает огромный ключ в инструменты. Для другого это - основанный на логике язык, что означает, что "код течет" (порядок, в котором Вы создаете программу), нелинейно. Существующие методы для создания очень усовершенствованных IDE просто не относятся к такой парадигме.

9
задан Jason Baker 3 November 2009 в 13:05
поделиться

3 ответа

The previous solutions do compile, but won't give the expected result. The function f is never applied to the arguments. A correct code is:

let rec list_map f ?(accum = []) l = match l with
    | head :: tail -> list_map f ~accum:(f head :: accum) tail
    | [] -> accum;;

The inferred type is:

val list_map : ('a -> 'b) -> ?accum:'b list -> 'a list -> 'b list = <fun>

... in contrast to the wrong one:

val list_map : 'a -> ?accum:'b list -> 'b list -> 'b list = <fun>

Please note, that the result list is reversed:

# list_map ( ( ** ) 2.) [1.;2.;3.;4.];;
- : float list = [16.; 8.; 4.; 2.]

... and equals the function rev_list from the List module:

# List.rev_map ( ( ** ) 2.) [1.;2.;3.;4.];;
- : float list = [16.; 8.; 4.; 2.]

So you may want to change your function into:

let rec list_map f ?(accum = []) l = match l with
    | head :: tail -> list_map f ~accum:(f head :: accum) tail
    | [] -> List.rev accum;;

... which should be tail-recursive as well (according to the manual) and returns the list in the original order:

# list_map ( ( ** ) 2.) [1.;2.;3.;4.];;
- : float list = [2.; 4.; 8.; 16.]
3
ответ дан 4 December 2019 в 07:14
поделиться

Вам нужен необязательный аргумент после необязательного. Просто измените порядок аргументов вашей функции:

let rec list_map f ?(accum=[]) l=
  match l with
    head :: tail -> list_map f  ~accum:(head :: accum) tail
  | [] -> accum;;
12
ответ дан 4 December 2019 в 07:14
поделиться

Да, ваш необязательный аргумент не может быть последним, потому что, поскольку OCaml поддерживает частичные приложения, функция, у которой отсутствует последний необязательный аргумент, будет выглядеть как частично примененная функция, которая является все еще ищу необязательный аргумент. Единственный способ сказать, что вы не собираетесь предоставлять необязательный аргумент, - это увидеть, что вы указали аргумент после него.

Если вам нужно, чтобы он оставался последним, вы можете поставить пустышку unit аргумент после него:

let rec list_map f l ?(accum=[]) () =
  match l with
      head :: tail -> list_map f tail ~accum:(head :: accum) ()
    | [] -> accum;;

Но в этом случае лучше изменить порядок.

16
ответ дан 4 December 2019 в 07:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: