3
我試圖找出如何結合參數化類型和類型變量在藥劑類型和功能規格。舉一個簡單的例子,假設我定義一個Stack
模塊:藥劑型規格和參數化類型變量
defmodule Stack do
@type t :: t(any)
@type t(value) :: list(value)
@spec new() :: Stack.t
def new() do
[]
end
# What should the spec be?
def push(stack, item) do
[item|stack]
end
end
第3行使用參數化類型規範,我可以定義,創建一個新的堆棧應該只包含整數的函數:
@spec new_int_stack() :: Stack.t(integer)
def new_int_stack(), do: Stack.new
到目前爲止,這麼好。現在我想確保只有整數可以被推入這個堆棧。例如,透析器應罰款與此:
int_stack = new_int_stack()
Stack.push(int_stack, 42)
但透析器應該抱怨這一點:
int_stack = new_int_stack()
Stack.push(int_stack, :boom)
我想不通的push
功能的型號規格應執行什麼。在二郎,我敢肯定,這句法會做的伎倆:
-spec push(Stack, Value) -> Stack when Stack :: Stack.t(Value).
有表達使用藥劑@spec
此約束的方法嗎?