Zulip Chat Archive
Stream: general
Topic: Default arguments with type parameter
Keeley Hoek (Aug 18 2018 at 10:42):
I've got a (honest, in-a-program) function
def do_some_stuff {α : Type} (cfg : config α) := xxx
In an ideal world, I'd like to be able to have a default config, with a fixed parameter α (obviously), so I could write do_some_stuff and everything would work great. I guess I want to be able to write (and compile)
def default_config : config string := xxx
def do_some_stuff {α : Type} (cfg : config α := default_config) := xxx
with that having the meaning that if cfg is omitted, the type α is forced to be string.
I see that I might be "fighting the system". What do you think is the best way to emulate this kind of option-passing interface?
Mario Carneiro (Aug 18 2018 at 11:50):
This comes up in core lean in some of the structures, where you have to give A such that A = B, and the proof of A = B is rfl but this only works if A is B. You can set this up using auto params instead of opt params:
def config : Type → Type := sorry
def default_config : config string := sorry
meta def default_config_tac : tactic unit := `[exact default_config]
def do_some_stuff {α : Type} (cfg : config α . default_config_tac) : α := sorry
example : string := do_some_stuff -- ok
example : nat := do_some_stuff (sorry : config ℕ) -- ok
example : nat := do_some_stuff -- error
Keeley Hoek (Aug 18 2018 at 11:56):
Thanks so much Mario. Do you know where I could read about the auto params "." period syntax?
Mario Carneiro (Aug 18 2018 at 11:57):
It might be in the reference manual? It's very simple. You can only put a name of a def of a tactic unit there, and it gets called when the argument is not supplied
Mario Carneiro (Aug 18 2018 at 11:57):
I wish it would accept an expression so you could write a tactic inline there, but alas
Keeley Hoek (Aug 18 2018 at 11:58):
ok sweet! cheers!
Mario Carneiro (Aug 18 2018 at 11:58):
(actually there is a good reason you can't write a tactic inline, since that would be meta)
Last updated: May 02 2025 at 03:31 UTC