2

私は「7週間の7つの言語」の本を読んでいて、1日目のerlangの自習で小さな問題を通過することはできません。

私のコードは次のようなものです:

-module(slsw).
-export([count_words/1]).
list_length([]) -> 0;
list_length(String) ->
    [_ | Tail] = String,
    1 + list_length(Tail).

count_words(Text) ->
    {_, R} = re:split(Text, " "),
    list_length(R).

しかし、私が開いたらerl、それをコンパイルして(c(slsw).)、次のようなもので使用してみてください:

slsw:count_words("yoo dude, this is a test").          

この厄介なランタイム例外が発生しました:

** exception error: no match of right hand side value [<<"yoo">>,<<"dude,">>,<<"this">>,<<"is">>,<<"a">>,
                                                       <<"test">>]
     in function  slsw:count_words/1 (slsw.erl, line 19)

配列を終了し、この例外をスローするようです。何が間違っているのでしょうか。

機能も見つけましたstring:wordsが、楽しく勉強したいです。

前もって感謝します

4

2 に答える 2

3

re:split/2タプルではなく、リストを返すだけです。それは本のテキストのタイプミスかもしれません。

確かに、Erlangエラーメッセージは、その言語に不慣れな人にとっては少しわかりにくいかもしれませんが、エラーメッセージを読むのに役立つヒントは、等号の右側が次のように評価されることを[<<"yoo">>,<<"dude,">>,<<"this">>,<<"is">>,<<"a">>,<<"test">>]示していることです(単にreからの戻り値:分割-つまり、バイナリのリスト)であり、左側の2タプルと一致させることはできません。

したがって、関数を次のように変更しただけであれば、それでcount_words十分です。

count_words(Text) ->
    R = re:split(Text, " "),
    list_length(R).
于 2012-12-12T01:05:22.853 に答える
2

re:split/2がタプルを返すとは思わない-リストを返す。したがって、{_、R} = re:split / 2 2行のエラーが発生します。これは、関数の戻り値が=の左側のタプルと一致しないためです。

于 2012-12-12T01:06:01.330 に答える