2016-09-13 2 views
1

Я создал свой собственный тип данных И я пытаюсь создать сумму всех чисел в этом типе данных, который является списком списков. Я не хочу использовать любые F # библиотекиF # сумма списка списков

Мой тип данных

type elist = A | L of int * elist 

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

пример:

let l = L(4, L(3, L(6, L(3, A)))) 

, который должен вернуть

val it : int 16 

Вот мой код, и я знаю, что это не так:

let rec sum l = 
    let a = 0 
    match l with 
    | A -> 0 
    | L(head,A) -> head 
    | L(head,tail) -> sum tail + a 
+0

Как и http://stackoverflow.com/q/39461659/126014 и http://stackoverflow.com/q/39462259/126014 Почти наверняка домашнее задание. –

ответ

3

Ты почти там. Все, что вам нужно, это потерять a:

let rec sum l = 
    match l with 
    | A -> 0 
    | L(head,A) -> head 
    | L(head,tail) -> head + sum tail 

Тогда оценка sum l когда l = L(4, L(3, L(6, L(3, A)))) дает

val it : int = 16 

по мере необходимости.

+0

Спасибо @RobLyndon. Если бы я хотел найти n-ый элемент списка l, как бы изменился мой код? – user2744489

+1

'let rec element l n = match (l, n) с | (A, _) -> с ошибкой «Вне диапазона» | (L (head, A), k) при k> 0 -> с ошибкой «Вне диапазона» | (L (голова, A), 0) -> голова | (L (голова, хвост), 0) -> голова | (L (голова, хвост), k) при k> 0 -> хвост элемента (k - 1) ' –

Смежные вопросы