Elixir函数的自定义typespec,用于确保用作函数参数的两个列表的维度

时间:2016-05-24 22:38:27

标签: elixir linear-algebra

我正在努力重新实现Elixir中NumPy / SciPy的一些基本线性代数功能。别担心,我知道这是一种有点轻浮的努力。我只是为了好玩而做。

目前我已经有了许多工作函数,但特别是对于我想添加一些自定义行为的向量。 最简单的例子就是这样。假设我有一个函数add_vectors/2

def add_vectors(vec_1, vec_2) do
  for {el_1, el_2} <- Enum.zip(vec_1, vec_2), do: el_1 + el_2
end

我可以轻松地用以下方式装饰它:

@spec add_vectors(list(), list()) :: list()

但是,这只检查该类型实际上是一个列表。 我知道您可以在elixir中定义自定义类型规范,但我不想编写一个宏来为任何维度N定义它。 有一种简单的方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:2)

如果我理解正确你想写一个说明向量/列表长度/维度的typespec?我非常确定它们超出了typespecs的范围,因为这些用于定义类型的规范,如名称所暗示的那样。根据文档:

  

Elixir附带声明用于声明类型和规格。 Elixir是动态类型的,因为编译器从不使用这样的typespec来优化或修改代码。尽管如此,使用typespecs作为文档和工具很有用,例如Dialyzer可以使用typespecs分析代码来查找错误。

查看文档我没有发现任何必须确保验证和指定功能属性的提及。你正在寻找的东西看起来更类似于像Java的JML这样的工具,用于合同设计,其中这些属性得到验证。我建议你看一下Elixir的合同设计:

Elixir Contracts

Talk about the project

如果你想为这类函数进行防御性编程,你也可以使用守卫和模式匹配(寻找when宏)。