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

Fredrik Svahn fredrik.svahn@REDACTED
Tue Jan 1 17:28:38 CET 2008


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 <yoel@REDACTED> 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
> erlang-questions@REDACTED
> http://www.erlang.org/mailman/listinfo/erlang-questions
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://erlang.org/pipermail/erlang-questions/attachments/20080101/8d365c1f/attachment.htm>


More information about the erlang-questions mailing list