Added support for GHC 7.10.1.
Removed support for GHC 7.0.4.
_
is no longer a valid name for a definition. The following fails
now: [Issue #1465] postulate _ : Set
assoc : (xs {ys zs} : List A) → ((xs ++ ys) ++ zs) ≡ (xs ++ (ys ++ zs))
instead of the longer
assoc : (xs : List A) {ys zs : List A} → ...
It also works with irrelevance
.(xs {ys zs} : List A) → ...
but of course does not make sense if there is hiding information already. Thus, this is (still) a parse error:
{xs {ys zs} : List A} → ...
{-# BUILTIN SIZEUNIV SizeUniv #-} -- SizeUniv : SizeUniv
{-# BUILTIN SIZE Size #-} -- Size : SizeUniv
{-# BUILTIN SIZELT Size<_ #-} -- Size<_ : ..Size → SizeUniv
{-# BUILTIN SIZESUC ↑_ #-} -- ↑_ : Size → Size
{-# BUILTIN SIZEINF ∞ #-} -- ∞ : Size
Size
and Size<
now live in the new universe SizeUniv
. It is
forbidden to build function spaces in this universe, in order to
prevent the malicious assumption of a size predecessor
pred : (i : Size) → Size< i
[Issue #1428].
Unambiguous notations (coming from syntax declarations) that resolve to ambiguous names are now parsed unambiguously [Issue #1194].
If only some instances of an overloaded name have a given associated notation (coming from syntax declarations), then this name can only be resolved to the given instances of the name, not to other instances [Issue #1194].
Previously, if different instances of an overloaded name had different associated notations, then none of the notations could be used. Now all of them can be used.
Note that notation identity does not only involve the right-hand side of the syntax declaration. For instance, the following notations are not seen as identical, because the implicit argument names are different:
module A where
data D : Set where
c : {x y : D} → D
syntax c {x = a} {y = b} = a ∙ b
module B where
data D : Set where
c : {y x : D} → D
syntax c {y = a} {x = b} = a ∙ b
Similarly, if two or more identical notations for a given overloaded name are in scope, and these notations do not all have the same fixity, then they get the default fixity.
Example:
NPred : Nat → Set
NPred 0 = Bool
NPred (suc n) = Nat → NPred n
const : Bool → ∀{n} → NPred n
const b {0} = b
const b {suc n} m = const b {n}
allOdd : ∀ n → NPred n
allOdd 0 = true
allOdd (suc n) m with even m
... | true = const false
... | false = allOdd n
with
-clauses
and use rewrite
.Example:
{-# OPTIONS --copatterns #-}
record Stream (A : Set) : Set where
coinductive
constructor delay
field
force : A × Stream A
open Stream
map : ∀{A B} → (A → B) → Stream A → Stream B
force (map f s) with force s
... | a , as = f a , map f as
record Bisim {A B} (R : A → B → Set) (s : Stream A) (t : Stream B) : Set where
coinductive
constructor ~delay
field
~force : let a , as = force s
b , bs = force t
in R a b × Bisim R as bs
open Bisim
SEq : ∀{A} (s t : Stream A) → Set
SEq = Bisim (_≡_)
-- Slightly weird definition of symmetry to demonstrate rewrite.
~sym' : ∀{A} {s t : Stream A} → SEq s t → SEq t s
~force (~sym' {s = s} {t} p) with force s | force t | ~force p
... | a , as | b , bs | r , q rewrite r = refl , ~sym' q
{-# OPTIONS --copatterns #-}
-- The Monad type class
record Monad (M : Set → Set) : Set1 where
field
return : {A : Set} → A → M A
_>>=_ : {A B : Set} → M A → (A → M B) → M B
open Monad {{...}}
-- The State newtype
record State (S A : Set) : Set where
field
runState : S → A × S
open State
-- State is an instance of Monad
instance
stateMonad : {S : Set} → Monad (State S)
runState (return {{stateMonad}} a ) s = a , s -- NEW
runState (_>>=_ {{stateMonad}} m k) s₀ = -- NEW
let a , s₁ = runState m s₀
in runState (k a) s₁
-- stateMonad fulfills the monad laws
leftId : {A B S : Set}(a : A)(k : A → State S B) →
(return a >>= k) ≡ k a
leftId a k = refl
rightId : {A B S : Set}(m : State S A) →
(m >>= return) ≡ m
rightId m = refl
assoc : {A B C S : Set}(m : State S A)(k : A → State S B)(l : B → State S C) →
((m >>= k) >>= l) ≡ (m >>= λ a → k a >>= l)
assoc m k l = refl
The new menu option Switch to another version of Agda
tries to do
what it says.
Changed feature: Interactively split result.
[ This is as before: ]
Make-case (C-c C-c
) with no variables given tries to split on the
result to introduce projection patterns. The hole needs to be of
record type, of course.
test : {A B : Set} (a : A) (b : B) → A × B
test a b = ?
Result-splitting ?
will produce the new clauses:
proj₁ (test a b) = ?
proj₂ (test a b) = ?
[ This has changed: ]
If hole is of function type, make-case
will introduce only pattern
variables (as much as it can).
testFun : {A B : Set} (a : A) (b : B) → A × B
testFun = ?
Result-splitting ?
will produce the new clause:
testFun a b = ?
A second invocation of make-case
will then introduce projection
patterns.
{-# OPTIONS
--dont-termination-check
--without-k
--senf-gurke
#-}
Unrecognized options:
--dont-termination-check (did you mean --no-termination-check ?)
--without-k (did you mean --without-K ?)
--senf-gurke
Nothing close to --senf-gurke
, I am afraid.
Fixed bug with unquoteDecl
not working in instance blocks
[Issue #1491].
Other issues fixed (see bug tracker