Okay so I've been lurking the dependent-types corner of the internet for a few months now and I keep going back and forth between Coq and Agda. I finally want to commit to one and actually finish the PLFA book or Software Foundations depending on which I pick.
My background: I know Haskell reasonably well, I've read most of TAPL, and I'm comfortable with the Curry-Howard correspondence at a surface level. I'm primarily interested in dependent type programming — writing correct-by-construction data structures, that kind of thing — rather than big math proof formalisations.
Given that framing, I'm leaning heavily toward Agda. My reasoning:
- Everything is term-mode — proofs and programs feel unified, not separate activities
- Pattern matching on indexed types is genuinely clean, no messing with dependent
match .. as .. return ..clauses - The Unicode + mixfix operators let you write code that actually looks like math notation
- Coming from Haskell, the feel is much more familiar
But I'm worried I'm missing something big about Coq's advantages. What do you all think? Especially interested in hearing from people who've used both seriously. No flame wars please — I know the forum rules 😸