Skip to content

Instantly share code, notes, and snippets.

@andreburgaud
Created June 28, 2017 15:16
Show Gist options
  • Save andreburgaud/b4fa81a3ad491ed89d1c41ea1d8e110f to your computer and use it in GitHub Desktop.
Save andreburgaud/b4fa81a3ad491ed89d1c41ea1d8e110f to your computer and use it in GitHub Desktop.
FutureLearn - Functional Programming in Erlang 2.11 - Where do I begin?
-module(more_lists).
-export([reverse/1,take/2,take2/2,test_take/0,test_take2/0]).
%% Take with direct recursion
-spec take(integer(), [T]) -> [T].
take(_, []) -> []; % handles case where N > length(Xs)
take(0, _) -> [];
take(N, [X|Xs]) when N > 0 -> [X | take(N-1, Xs)].
test_take() ->
[] = take(0,"hello"),
"hell" = take(4,"hello"),
"hello" = take(5,"hello"),
"hello" = take(9,"hello"),
success.
%% Reverse a list (helper for the tail recursive take).
-spec reverse([T]) -> [T].
reverse(Xs) -> reverseR(Xs, []).
-spec reverseR([T], [T]) -> [T].
reverseR([], Ys) -> Ys;
reverseR([X|Xs], Ys) -> reverseR(Xs, [X|Ys]).
%% Take with tail recursion
-spec take2(integer(), [T]) -> [T].
take2(N, Xs) -> reverse(takeR(N, Xs, [])).
%% Helper for tail recursive take
-spec takeR(integer(), [T], [T]) -> [T].
takeR(_, [], Ys) -> Ys;
takeR(0, _, Ys) -> Ys;
takeR(N, [X|Xs], Ys) when N > 0 ->
takeR(N-1, Xs, [X | Ys]).
test_take2() ->
[] = take2(0,"hello"),
"hell" = take2(4,"hello"),
"hello" = take2(5,"hello"),
"hello" = take2(9,"hello"),
success.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment