2017-02-12 3 views
1

В приведенном ниже примере я хотел бы указать тип аргумента в вызове apply(M, F, A), но я не могу понять, как это сделать. Здесь, dialyzer не жалуется на тип несоответствия между {event, "something append !"} и {anyevent, string()} определения типа в callback_function спецификации:Можете ли вы указать тип аргумента функции в erlang, используя apply (M, F, A)?

-module(erl_test). 

-export([ 
     callback_function/1, 
     test_it/0 
     ]). 

-spec callback_function(
    Event::{anyevent, string()}) -> ok. 
callback_function(Event) -> 
    io:format("event received: ~p~n", [Event]), 
    ok. 

-spec notify_something(CbMod::module(), CbFun::atom()) -> ok. 
notify_something(CbMod, CbFun) -> 
    apply(CbMod, CbFun, [{event, "something append !"}]), 
    ok. 

test_it() -> 
    notify_something(?MODULE, callback_function). 

Или у вас есть какие-либо другие конструкции предложения, которые я мог бы использовать, чтобы сделать проверку типа на функцию обратного вызова?

Спасибо!

ответ

1

Использование apply/3 как есть, я считаю, что вам не повезло. Однако, вы можете изменить строку:

apply(CbMod, CbFun, [{event, "something append !"}]), 

к:

CbMod:CbFun([{event, "something append !"}]), 

Это сделало бы диализных знать, указанного типа аргумента.

+0

спасибо! отлично работает с 'CbMod: CbFun ({event," something append! "}),' – JSM

Смежные вопросы