Permalink
Fetching contributors…
Cannot retrieve contributors at this time
51 lines (36 sloc) 1.34 KB
%% The contents of this file are subject to the Mozilla Public License
%% Version 1.1 (the "License"); you may not use this file except in
%% compliance with the License. You may obtain a copy of the License
%% at http://www.mozilla.org/MPL/
%%
%% Software distributed under the License is distributed on an "AS IS"
%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
%% the License for the specific language governing rights and
%% limitations under the License.
%%
%% The Original Code is Erlando.
%%
%% The Initial Developer of the Original Code is VMware, Inc.
%% Copyright (c) 2011-2013 VMware, Inc. All rights reserved.
%%
%% List Monad. Mainly just for fun! As normal, this is depth first.
-module(list_m).
-behaviour(monad).
-export(['>>='/2, return/1, fail/1]).
-behaviour(monad_plus).
-export([mzero/0, mplus/2]).
%% Note that using a list comprehension is (obviously) cheating, but
%% it's easier to read. The "real" implementation is also included for
%% completeness.
-spec '>>='([A], fun( (A) -> [B] )) -> [B].
'>>='(X, Fun) -> lists:append([Fun(E) || E <- X]).
%% lists:foldr(fun (E, Acc) -> Fun(E) ++ Acc end, [], X).
-spec return(A) -> [A].
return(X) -> [X].
-spec fail(any()) -> [_A].
fail(_E) -> [].
-spec mzero() -> [_A].
mzero() -> [].
-spec mplus([A], [A]) -> [A].
mplus(X, Y) ->
lists:append(X, Y).