erlang中元组的模式匹配

时间:2015-03-05 07:36:15

标签: erlang

我是erlang的新学习者,我正在寻找一本名为Introducing erlang的书。在本书中,它有一些例子如下:

-module(ask).
-export([term/0]).

term() ->
    Input = io:read("What {planemo, distance} ? >>"),
    process_term(Input).

process_term({ok, Term}) when is_tuple(Term) ->
    Velocity = drop:fall_velocity(Term),
    io:format("Yields ~w. ~n",[Velocity]),
    term();

process_term({ok, quit}) ->
    io:format("Goodbye.~n");
    % does not call term() again

process_term({ok, _}) ->
    io:format("You must enter a tuple.~n"),
    term();

process_term({error, _}) ->
    io:format("You must enter a tuple with correct syntax.~n"),
    term().

以下是调用ask模块的示例:

6> c(ask).
{ok,ask}
7> ask:term().
What {planet, distance} ? >>{mars,20}.
Yields 12.181953866272849.
What {planet, distance} ? >>20.
You must enter a tuple.
What {planet, distance} ? >>quit.
Goodbye.
ok

我不明白为什么What {planet, distance} ? >>quit.process_term({ok, quit})功能匹配?你只输入'quit',而不是元组, 我认为它不应该与process_term({ok, quit})函数匹配。那里有人可以解释原因吗?

2 个答案:

答案 0 :(得分:4)

根据io:read/1http://www.erlang.org/doc/man/io.html#read-1)的文档,它返回一个元组{ok, Term}。即,您输入 foo io:read返回{ok, foo},您输入{bar, 10}io:read返回{ok, {bar, 10}}

所有process_term子句在{ok, _whatever the user typed_}上匹配,或者如果某些内容失败,则{error, Reason}(这是所有Erlang样式)。

答案 1 :(得分:0)

此外,在您的代码中,您有process_term({ok, Term}) when is_tuple(Term) ->获取输入,前提是它是一个元组,因此是when子句。当您输入'退出'时,它不必是{ok, quit}接受的元组,它与它们匹配并返回输出。 希望这会有所帮助。