我想知道是否有可能有一个函数为不同的参数类型做不同的事情,包括用户定义的类型。
这是我想做的一个例子:
myfunction(myType i) ->
dothis;
myfunction(int s) ->
dothat.
这是可能的,如果是的话,这样做的语法是什么?
我想知道是否有可能有一个函数为不同的参数类型做不同的事情,包括用户定义的类型。
这是我想做的一个例子:
myfunction(myType i) ->
dothis;
myfunction(int s) ->
dothat.
这是可能的,如果是的话,这样做的语法是什么?
确实,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.
您不能在 Erlang 中定义自己的数据类型,因此第一个子句是不可能的。您在警卫中进行类型测试,因此第二个将变为:
my_function(S) when is_integer(S) ->
dothat.
守卫中可以做的事情非常有限,它由简单的测试组成,例如类型测试。阅读Guard Sequences。