[erlang-questions] The reason for "no case clause matching" error?

Hynek Vychodil <>
Thu Jan 3 17:39:30 CET 2008


A little more efficient version:

-module(ppar).
-export([ppar/1]).

sp(Lhs, []) ->
   [[Lhs]];
sp(Lhs, Rhs) ->
   [ [Lhs|P] || P <- ppar(Rhs)].

ppar([]) ->
   [[[]]];
ppar([H]) ->
   [[[H]]];
ppar(Lst)  ->
   [SP ||
   N <- lists:seq(1,length(Lst)),
   SP <- begin
   		{Lhs, Rhs} = lists:split(N, Lst),
		sp(Lhs, Rhs)
	end].

On 1/1/08, Fredrik Svahn <> wrote:
> Hi,
>
>
> I cannot say I fully understand the error message. However the reference
> manual says:
>
> "List comprehensions are written with the following syntax:
> [Expr || Qualifier1,...,QualifierN]
>
>
>
>
> Expr is an arbitrary expression, and each Qualifier is either a generator or
> a filter.
>
>
>  A generator is written as:
>    Pattern <- ListExpr.
>  ListExpr must be an expression which evaluates to a list of terms.
> A filter is an expression which evaluates to true or false."
> Some of the Qualifiers you use in your list comprehension (e.g. Lhs =
> lists:sublist(Lst, 1, N)) are neither generators nor filters since they do
> not contain "<-" and evaluates to lists rather than true or false.
>
> I suggest rewriting the last function clause to:
>
> ppar(Lst)  ->
>    [SP ||
>    N <- lists:seq(1,length(Lst)),
>    SP <- sp(lists:sublist(Lst, 1, N), lists:sublist(Lst, N+1,
> length(Lst)))].
>
> or (to maintain the variables for clarity)
>
> ppar(Lst)  ->
>     [SP || N <- lists:seq(1,length(Lst)),
>        SP <- begin
>              Lhs = lists:sublist(Lst, 1, N),
>              Rhs = lists:sublist(Lst, N+1, length(Lst)),
>              sp(Lhs, Rhs)
>          end].
>
>
> Gives:
>
> 2> test4:ppar([2,2,3]).
> [[[2],[2],[3]],[[2],[2,3]],[[2,2],[3]],[[2,2,3]]]
>
> Hope this helps.
>
> BR /Fredrik
>
>
>
>  On Jan 1, 2008 1:08 PM, Yoel Jacobsen <> wrote:
> >
> > Hello,
> >
> >
> > I want to implement some sort of list partitioning in Erlang.
> >
> >
> > The ppar function should work like that:
> >
> > ppar [2,2,3] -> [[[2],[2],[3]], [[2],[2,3]], [[2,2],[3]],[ [2,2,3]]]
> > ppar [2,2,3,4] -> [[[2],[2],[3],[4]], [[2],[2],[3,4]], [[2],[2,3],[4]],
> > [[2],[2,3,4]], [[2,2],[3],[4]], [[2,2],[3,4]], [[2,2,3],[4]], [[2,2,3,4]]]
> >
> >
> > This is the code I have written:
> >
> > -module(ppar).
> > -export([ppar/1]).
> >
> >
> > sp(Lhs, []) ->
> >    [[Lhs]];
> > sp(Lhs, Rhs) ->
> >    [lists:append([Lhs], P) || P <- ppar(Rhs)].
> >
> > ppar([]) ->
> >    [[[]]];
> > ppar([H|[]]) ->
> >    [[[H]]];
> > ppar(Lst)  ->
> >    [SP ||
> >    N <- lists:seq(1,length(Lst)),
> >    Lhs = lists:sublist(Lst, 1, N),
> >    Rhs = lists:sublist(Lst, N+1, length(Lst)),
> >    SP <- sp(Lhs, Rhs)].
> >
> > Yet, when I try it I get an error:
> >
> > 1> ppar:ppar([1,2,3]).
> > ** exception error: no case clause matching [1]
> >     in function  ppar:'-ppar/1-lc$^0/1-0-'/2
> >
> > Why is that?
> >
> > Yoel
> >
> >
> >
> > _______________________________________________
> > erlang-questions mailing list
> > 
> > http://www.erlang.org/mailman/listinfo/erlang-questions
> >
>
>
> _______________________________________________
> erlang-questions mailing list
> 
> http://www.erlang.org/mailman/listinfo/erlang-questions
>


-- 
--Hynek (Pichi) Vychodil



More information about the erlang-questions mailing list