在Fin模式中使用文字数字

时间:2017-11-15 04:03:07

标签: pattern-matching literals agda pattern-synonyms

一方面,我可以使用#_从文字中构建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

1 个答案:

答案 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定义实例。