0

我想知道是否有可能有一个函数为不同的参数类型做不同的事情,包括用户定义的类型。

这是我想做的一个例子:

myfunction(myType i) ->
    dothis;
myfunction(int s) ->
    dothat.

这是可能的,如果是的话,这样做的语法是什么?

4

2 回答 2

4

确实,erlang 不提供定义类型的能力,但是可以认为类型可能是建立在主要 erlang 类型上的结构,例如,类型answer可以是 {From,Time,List} 的形式,在这种情况下可以混合使用模式匹配和主要类型测试:

myfunction({From,Time,List}) when is_pid(From), is_integer(Time), Time >= 0, is_list(List) ->
    dothis;
myfunction(I) when is_integer(I) ->
    dothat.

并且比您正在寻找的简单类型测试更接近,您可以使用宏进行测试

-define(IS_ANSWER(From,Time,List), (is_pid(From)), is_integer(Time), Time >= 0, is_list(List)).

myfunction({From,Time,List}) when ?IS_ANSWER(From,Time,List) ->
        answer;
myfunction(I) when is_integer(I) ->
        integer.   

甚至

-define(IS_ANSWER(A), (is_tuple(A) andalso size(A) == 3 andalso is_pid(element(1,A)) andalso is_integer(element(2,A)) andalso element(2,A) >= 0 andalso is_list(element(3,A)))).

myfunction(A) when ?IS_ANSWER(A) ->
        answer;
myfunction(A) when is_integer(A) ->
        integer.
于 2013-11-12T23:19:49.963 回答
2

您不能在 Erlang 中定义自己的数据类型,因此第一个子句是不可能的。您在警卫中进行类型测试,因此第二个将变为:

my_function(S) when is_integer(S) ->
    dothat.

守卫中可以做的事情非常有限,它由简单的测试组成,例如类型测试。阅读Guard Sequences

于 2013-11-12T21:28:06.993 回答