パターンマッチング:illegal patternですか

うーん、++という演算子が、配列に対するものだという理解を深めていけば、理由はわかるようになるんだろうか。

14> Aho = fun("abc" ++ TT) -> TT end .
#Fun
15> Aho("abcE").
"E"
16> Kue = fun("abc" ++ YY ++ "k") -> YY end.
 ** 1: illegal pattern **
17> Kue = fun(YY ++ "abc") -> YY end .
 ** 1: illegal pattern **
18> Kue = fun("def" ++ YY) -> YY end.
#Fun
19> Kue("choko").

 =ERROR REPORT==== 17-Jun-2008::03:19:43 ===
Error in process <0.74.0> with exit value: {function_clause,[{erl_eval,'-inside-a-shell-fun-',["choko"]},{erl_eval,expr,3}]}

 ** exited: {function_clause,[{erl_eval,'-inside-a-shell-fun-',["choko"]},
                             {erl_eval,expr,3}]} **
20> Kue("defchoko").
"choko"
21> Kue("def choko").
" choko"
22> 

とりあえず、引数のパターンマッチングにあまり期待するのはやめよう>自分。
さりとて、RubyPerlで使われている正規表現ライブラリをくっつけるのは気が進まない。並列動作時のボトルネックにならないか心配なのだ(テストしてみろ>自分)

というわけで、ちまちまとmatchとかskip_spaceなどを書いてみている。

match (, T) -> {true, T};
match (S, ) -> {false, S};
match ([HS|TS], [HT|TT]) ->
        case HS =:= HT of
            true -> match(TS, TT);
            false -> {false, [HS|TS]}
        end.

skip_space([32|L]) -> skip_space(L);
skip_space(_Any) -> _Any.

これをfun()を使って変数に代入して、mapしたりconcatenateしたりできんものかと、、、こういうのは、他の関数型言語正規表現の使い方をまず勉強すべきだな。