【问题标题】:Describing a function in a list of parameters在参数列表中描述函数
【发布时间】:2021-11-02 12:31:00
【问题描述】:

我有这样的功能描述:

-spec match_evaluator(ReplaceFun, Text, Regex) -> Result
   when ReplaceFun :: function(),
        Text :: string(),
        Regex :: string(),
        Result :: string().

match_evaluator(ReplaceFun, Text, Regex) ->

我想对参数ReplaceFun的参数进行更详细的说明。 ReplaceFun 是一个函数的链接。

类似的东西:

-type replace_fun(string(),[string()]) :: {string(), non_neg_integer()}.
% : bad type variable

我想正确定义这个类型(一个有两个参数和返回类型的函数)。请告诉我如何正确描述这个函数的类型。

【问题讨论】:

    标签: types erlang


    【解决方案1】:

    您可以编写例如fun((string(), string()) -> string()) 来引用一个接受两个字符串并返回一个字符串的函数。如果您不关心参数或返回类型是什么,请在它们的位置使用any()。我推荐Erlang documentation 的讲座以获得更多选择。

    【讨论】:

    • 感谢拉多斯瓦夫的建议!不幸的是,这个解决方案不起作用。此外,如果我们将它按原样添加到-spec 指令中,我们将得到一个语法错误。感谢您提供类型描述的链接。解决方案是使用-type.实现功能描述,我还没有写这些类型。我正在考虑。
    • 老实说,我不明白那个符号有什么问题。你能用不同的词来表达吗?
    • 我有这个函数的描述:``` -spec match_evaluator(DoAction, Text, Regex) -> Result when DoAction :: function(), Text :: string(), Regex ::字符串()|元组(),结果::字符串()。 ```
    • 这是一个笼统的描述,很合适,但我想详细说明一下。 source code
    • 那么就写DoActions :: fun((string()) -> string()),这样不行吗? (注意括号)
    【解决方案2】:

    函数match_evaluator有一个-spec

    -spec match_evaluator1(ReplaceFun, Text, Regex) -> Result
       when ReplaceFun :: fun((FullString :: string(), MatchResult :: [string()]) -> 
            (NewString :: string())),
            Text :: string(),
            Regex :: string(),
            Result :: string().
    
    match_evaluator1(ReplaceFun, Text, Regex) ->
    %..
    

    解决方案的想法是由@radrowreference_manual 和 Erlang 标准库的源代码socket_test_evaluator.erl(我在文件夹erlang/otp/erts/emulator/test 中找到的)提示我的。

    这个函数的源代码是here

    【讨论】:

      猜你喜欢
      • 2013-03-25
      • 2011-08-08
      • 2018-06-03
      • 2021-05-06
      • 2014-11-17
      • 2015-12-10
      • 1970-01-01
      • 1970-01-01
      • 2014-03-06
      相关资源
      最近更新 更多