F # Проверить, если список пуст - PullRequest
0 голосов
/ 17 сентября 2018

Как новичок в F #, я пытаюсь реализовать простую функцию, которая принимает индекс и список в качестве параметров, а затем возвращает значение списка данного индекса.

let rec getElementAtIndex (index : int) (list : 'a list) = 
  match index, list with
    | _ ,[] -> failwith "index is greater than number of elements in list.."
    | _, _ when index < 0 -> failwith "index is less than 0." 
    | 0, (first::_) -> first
    | _, (_::rest') -> getElementAtIndex (index - 1) rest'

Мое решение работает нормально, но когда я даю параметр индекса больше размера списка и когда я даю пустой список в качестве параметра, в обеих ситуациях происходит одно и то же условие, равное

| _ ,[] -> failwith "index is greater than number of elements in list."

Как мне избежать этого и проверить, если список пуст и данный индекс больше размера списка отдельно, без использования методов библиотеки .net?

Любая помощь будет оценена

1 Ответ

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

Шаблон для проверки глобальных предварительных условий заключается во вложении функций, то есть сначала проверяет предварительные условия, а затем начинает рекурсивную работу с фактической работой.Таким образом, рекурсивная функция упрощается, и нет необходимости в when охранниках или length:

let getElementAtIndex index list =
  if index < 0 then failwith "index is less than 0"
  if List.isEmpty list then failwith "list is empty"
  let rec get = function
    | _ , [] -> failwith "index is greater than number of elements in list"
    | 0, first::_ -> first
    | _, _::rest -> get(index - 1, rest)
  get(index, list)

Синтаксис function является сокращением для:

  let rec get i l =
    match i, l with
    | _ , [] -> failwith "index is greater than number of elements in list"
    | 0, first::_ -> first
    | _, _::rest -> get (index - 1) rest

Обновление

Вместо if List.isEmpty list then failwith "list is empty" вы можете использовать match list with [] -> failwith "..." | _ -> () или if list = [] then failwith "..." Последнее работает только для списков элементов, поддерживающих равенство.

...