一方面,我可以使用#_
从文字中构建Fin
:
open import Data.Fin
data I'mFinnish : Set where
Mk : Fin 5 → I'mFinnish
foo : I'mFinnish
foo = Mk (# 3)
另一方面,我可以使用文字来对自然进行模式匹配:
open import Data.Nat
data I'mANatural : Set where
Mk : ℕ → I'mANatural
open import Data.Bool
bar : I'mANatural → Bool
bar (Mk 3) = true
bar _ = false
我的问题是,在Fin
匹配时,我可以on the gripping hand使用文字吗?即,我可以做些什么来近似以下,无效的原样,Agda代码:
open import Data.Bool
bar′ : I'mFinnish → Bool
bar′ (Mk 3) = true
bar′ _ = false
答案 0 :(得分:3)
您正在寻找literal overloading。引用文档,Agda.Builtin.FromNat模块提供了类型类
record Number {a} (A : Set a) : Set (lsuc a) where
field
Constraint : Nat → Set a
fromNat : ∀ n → {{_ : Constraint n}} → A
open Number {{...}} public using (fromNat)
{-# BUILTIN FROMNAT fromNat #-}
允许超载自然文字。 Fin
的实例也可以在前一个链接中找到。您可以直接为I'mFinnish
定义实例。