Erlang中如何正确定义函数类型,为-spec的ReplaceFun参数补充详细描述
正确的函数类型定义方案
错误原因说明
你之前的写法误用了参数化类型的语法定义函数类型,不符合Erlang类型系统规则,所以触发bad type variable报错。
Erlang中定义带参数的函数类型需使用fun((参数类型1, 参数类型2) -> 返回值类型)的语法规则。
方案1:单独定义自定义函数类型
首先定义独立的replace_fun类型:
-type replace_fun() :: fun((string(), [string()]) -> {string(), non_neg_integer()}).
之后直接在函数spec中引用该类型即可:
-spec match_evaluator(ReplaceFun, Text, Regex) -> Result when ReplaceFun :: replace_fun(), Text :: string(), Regex :: string(), Result :: string().
方案2:直接在spec中声明函数类型(无需单独定义类型)
如果不需要复用该函数类型,可以直接把类型写在spec里:
-spec match_evaluator(ReplaceFun, Text, Regex) -> Result when ReplaceFun :: fun((string(), [string()]) -> {string(), non_neg_integer()}), Text :: string(), Regex :: string(), Result :: string().
内容的提问来源于stack exchange,提问作者Anatolii Kosorukov
相关产品推荐
相关产品推荐

