[英]Currying with dependent types in agda
我以為您可以在Agda中使用任何功能。 這樣您就可以始終交換輸入的順序。
一個定理表示甚至可以編譯:
curry : {A : Set} -> {B : Set} -> {C : Set} -> ( A -> B -> C) -> (B -> A -> C)
curry f b a = f a b
但是,Agda具有依賴類型,例如
curry' : {A : Set} -> {B : ( A -> Set ) } -> { C : ( A -> Set ) } -> ( (a : A) -> B a -> C a) -> ( B a -> (a : A) -> C a)
甚至不編譯。
因為(a : A) -> B a -> C a
與A -> B -> C
一樣有效,所以我開始認為您一般不能咖喱。 盡管在a : A
之前傳遞函數B a
似乎沒有什么特別可怕a : A
。
總的來說,是否有一些技巧可以進行欺騙? 還是在阿格達不可能?
您所描述的不是輕率的。 這是一個簡單的參數交換。
這是多條彎彎的樣子:
open import Data.Product
hiding (curry)
-- non-dependent version
curry′ : ∀ {a b c} {A : Set a} {B : Set b} {C : Set c} →
(A × B → C) → (A → B → C)
curry′ f a b = f (a , b)
-- dependent version
curry : ∀ {a b c} {A : Set a} {B : A → Set b} {C : Set c} →
(Σ A B → C) → ((a : A) → B a → C)
curry f a b = f (a , b)
C
也可以取決於A
和B
; 完全依賴的版本可以在Data.Product
找到。
無論如何,這還不重要。 您想要的操作(即依賴於swap
)不能在Agda中實現,也不能在大多數其他依賴類型理論中實現。
您可以執行以下操作:
open import Level
open import Function hiding (id)
open import Data.Nat
open import Data.Vec
data Id {α : Level} {A : Set α} : A -> Set α where
id : (x : A) -> Id x
flip-id : {α β γ : Level} {A : Set α} {B : A -> Set β} {C : (x : A) -> B x -> Set γ} {x : A}
-> ((x : A) -> (y : B x) -> C x y) -> (y : B x) -> Id x -> C x y
flip-id f y (id x) = f x y
test-func : (n : ℕ) -> Vec ℕ n -> ℕ
test-func n _ = n
{-error : ℕ
error = flip test-func (0 ∷ 0 ∷ []) 2-}
ok : ℕ
ok = flip-id test-func (0 ∷ 0 ∷ []) (id 2)
還有對稱函數:
id-flip : {α β γ : Level} {A : Set α} {B : A -> Set β} {C : (x : A) -> B x -> Set γ}
-> ({x : A} -> (y : B x) -> Id x -> C x y) -> (x : A) -> (y : B x) -> C x y
id-flip f x y = f y (id x)
如果在兩個函數中都使用相同的a : A
則可以定義它,即
foo : {A : Set} {B C : A → Set}(a : A) →
(A → B a → C a) →
(B a → A → C a)
foo a f Ba _ = f a Ba
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.