Если у меня есть пользовательский тип списка в F #, как я могу получить начало и конец списка этого типа - PullRequest
0 голосов
/ 12 июня 2018

У меня есть пользовательский список в F #, например:

type 'element mylist = NIL | CONS of 'element * 'element mylist

И я хочу перевернуть список этого типа, используя что-то похожее на

let rec helperOld a b =
    match a with
    | [] -> b
    | h::t -> helperOld t (h::b)

let revOld L = helperOld L []

То, что я имеюдо сих пор думал сделать что-то вроде

let rec helper a b = 
    match a with
    | NIL -> b
    | CONS(a, b) -> helper //tail of a, head of a cons b

Однако я не могу понять, как получить хвост и голову a.Стандартные a.Head и a.Tail не работают.Как я могу получить доступ к этим элементам в этом пользовательском списке?

1 Ответ

0 голосов
/ 12 июня 2018

Ваша вспомогательная функция не должна использовать функции Head или Tail, потому что она может извлекать эти значения с помощью сопоставления с образцом:

let rec helper a b = 
    match a with
    | NIL -> b
    | CONS(x, xs) -> helper xs (CONS(x, b))

Стандартные функции Head и Tail не работают, потому что у вас есть пользовательскийопределение списка.Вы можете создавать свои собственные функции с сопоставлением с шаблоном, который похож на маршрут, по которому вы шли:

let myHead xs =
    match xs with
    | NIL -> None
    | CONS(h, _) -> Some(h)

let myTail xs =
    match xs with
    | NIL -> None
    | CONS(_, t) -> Some(t)
...