暗黙の引数を取り除けば、これを非常に簡単に実装できます。
showLen : (len : ℕ) (A : Set) → Vec A len → ℕ
showLen len _ _ = len
実際、両方を同時に行うことができます。
open import Data.Product
showBoth : (len : ℕ) (A : Set) → Vec A len → ℕ × Set
showBoth len A _ = len , A
現在、暗黙の引数は、コンパイラが独自に埋めようとするという事実を除けば、通常の引数と同じです。必要に応じて、いつでもこの動作をオーバーライドできます。
非表示の引数を持つ関数を実装したい場合、何らかの理由でそれらにアクセスする必要がある場合は、次のように中括弧内で言及することで実現できます。
replicate : {n : ℕ} {A : Set} → A → Vec A n
replicate {zero} _ = []
replicate {suc _} x = x ∷ replicate x
次に、関数を呼び出して隠し引数を指定する必要がある場合、プロセスは似ています。
vec : Vec ℕ 4
vec = replicate {4} 0
さて、これをshowBoth
上記に適用するだけです:
showBoth : {len : ℕ} {A : Set} → Vec A len → ℕ × Set
showBoth {len} {A} _ = len , A
ここで、引数の順序が間違っているとします。たとえば、引数でA
はなく引数を明示的に指定したい場合は、次のようn
にする必要があります。
vec₂ : Vec ℕ 4
vec₂ = replicate {_} {ℕ} 0
ここで、 n番目の暗黙の引数を入力する必要がある場合、これはすぐに面倒になります。そのため、Agda はそれらを名前で参照するオプションを提供します。
vec₃ : Vec ℕ 4
vec₃ = replicate {A = ℕ} 0
これは、型シグネチャで指定された名前を使用します。関数を定義するときにこれを使用することもできます。
showType : {len : ℕ} {A : Set} → Vec A len → Set
showType {A = Type} _ = Type