erlang中

时间:2016-05-12 10:49:41

标签: types erlang dialyzer

我正在学习erlang并试图在可能的情况下使用透析器来获得最大的类型安全性。有一件事我不明白:非终止函数的类型是什么以及如何在规范中表示它。你能否对此有所了解?

2 个答案:

答案 0 :(得分:7)

永远循环且永不终止的函数具有返回类型no_return()。 (该返回类型也用于总是抛出异常的函数,例如自定义错误函数。如果您没有指定返回类型,Dialyzer会告诉您函数"没有本地返回" 。)

这在Erlang参考手册的Types and Function Specifications章节中提到:

  

Erlang中的某些函数并不意味着返回;要么是因为它们定义了服务器,要么是因为它们用于抛出异常,如下面的函数所示:

my_error(Err) -> erlang:throw({error, Err}).
     

对于此类功能,建议通过以下形式的合同为他们的" return"使用特殊no_return()类型:

-spec my_error(term()) -> no_return().

答案 1 :(得分:-1)

以下示例在Elixir中,但我相信它们也可以在类型规范中使用no_returnnone清除Erlangers:

 defmodule TypeSpecExamples do
   @moduledoc """
   Examples of typespecs using no_return and none.
   """

   @spec forever :: no_return
   def forever do
     forever()
   end

   @spec only_for_side_effects :: no_return
   def only_for_side_effects do
     IO.puts "only_for_side_effects"
     :useless_return_value # delete this line to return the value of the previous line
   end

   @spec print_dont_care :: no_return
   def print_dont_care do
     IO.puts("""
       A no_return function that does not loop always returns a value, \
       which can be anything, such as the atom #{only_for_side_effects()}
       """)
   end

   @spec always_crash :: none
   def always_crash do
     raise "boom!"
   end

   @spec value_or_crash(boolean) :: number | none
   def value_or_crash(b) do
     if b do
       1
     else
       raise "boom!"
     end
   end

 end