Last active
February 28, 2017 06:32
-
-
Save javajosh/d3726355ec78ee499224c832d64ff476 to your computer and use it in GitHub Desktop.
Erlang list manipulation for https://www.futurelearn.com/courses/functional-programming-erlang/1/steps/155694#fl-comments
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
%%%------------------------------------------------------------------- | |
%%% @author Josh Rehman | |
%%% @copyright (C) 2017, JavaJosh Enterprises | |
%%% @doc | |
%%% | |
%%% @end | |
%%% Created : 27. Feb 2017 6:54 PM | |
%%%------------------------------------------------------------------- | |
-module(l2). | |
-author("Josh Rehman"). | |
%% API | |
-export([double/1, evens/1, take/2, odds/1]). | |
% Define an Erlang function double/1 to double the elements of a list of numbers. | |
double(X) -> double(X, []). | |
double([],Doubled) -> Doubled; | |
double([X|Xs], Doubled) -> | |
double(Xs, [2*X | Doubled]). | |
% Define a function evens/1 that extracts the even numbers from a list of integers. | |
evens(X) -> | |
evens(X, []). | |
evens([], Evens) -> | |
Evens; | |
evens([X|Xs], Evens) when X rem 2 == 0 -> | |
evens(Xs, [X|Evens]); | |
evens([_X|Xs], Evens) -> | |
evens(Xs, Evens). | |
% Define a function odds/1 that extracts odd numbers, using the case statement. (This one is a bonus). | |
%%odd(X) when X rem 2 == 1 -> true; | |
%%odd(X) -> false. | |
% Wanted to use a case statement, but failed. | |
odds(X) -> odds(X,[]). | |
odds([],X) -> X; | |
odds([X|Xs], Odds) -> | |
case X of | |
X when (X rem 2) == 1 -> odds(Xs, [X|Odds]); | |
_ -> odds(Xs,Odds) | |
end. | |
% Define a function take that takes the first N elements from a list. | |
% Problem: it returns them in reverse order. | |
take(N,X) -> | |
reverse(take(N,X,[])). | |
take(0, _X, Taken) -> | |
Taken; | |
take(N,[X|Xs], Taken) -> | |
take(N-1, Xs, [X | Taken]). | |
% This feels a little wasteful. Would be better to have | |
% an "append" function somewhere. | |
reverse(X) -> reverse(X,[]). | |
reverse([],Result) -> Result; | |
reverse([X|Xs],Result) -> | |
reverse(Xs, [X|Result]). |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment