Reputation: 23
Let's suppose that I have some f : A -> B
, a : A
, b : B
. I want new function, that is almost a copy of f
, but it should produce b
for an argument a
.
I was trying something like this.
replace_f : ∀ {A B} (f : A -> B) (a : A) (b : B)
-> (A -> B)
replace_f f a b = \ { a -> b ; attr -> f attr }
But the a
in the lambda definition is not the same as a
that I am trying to replace.
Agda just considers it as a variable.
P. S.
I have also tried to use Decideable and prop equality in replace_f f a b var = if ⌊ Dec (var ≡ a) ⌋ then b else (f var)
.
However, it errors with Set _p_391 !=< Dec _P_386 when checking that the expression Dec (var ≡ a) has type Dec _P_386
P. P. S.
If you want to reproduce the Decidable
solution, use these imports
open import Relation.Binary.PropositionalEquality using (_≡_)
open import Relation.Nullary
open import Relation.Nullary.Decidable
open import Relation.Binary.Core
open import Data.Bool
Upvotes: 1
Views: 106
Reputation: 23
Answer to the question given by my supervisor.
He suggests to implement and provide the equality test for the A
type.
Overall, the replace_f
will look like this:
replace_f : ∀ {A B} (decide : (x : A) -> (y : A) -> Dec (x ≡ y)) (f : A -> B ) (a : A) (b : B ) -> (A -> B )
replace_f decide f a b var = if ⌊ decide var a ⌋ then b else (f var)
where decide is an actual implementation for comparison
Actually, you could derive Eq clause automatically in Agda, see Haskell Deriving Mechanism for Agda
Upvotes: 1