Zulip Chat Archive

Stream: general

Topic: automatic coercion?


Kenny Lau (May 20 2020 at 11:01):

import data.finset

#check λ s : finset , (s : set ) -- invalid type ascription, term has type
#check λ s : finset , (s : set ) -- λ (s : finset ℕ), ↑s : finset ℕ → set ℕ
#check λ x : , (x : ) -- λ (x : ℕ), ↑x : ℕ → ℤ

Kenny Lau (May 20 2020 at 11:01):

why does N auto. coerce to Z but not finset to set?

Shing Tak Lam (May 20 2020 at 11:20):

(nevermind)

Shing Tak Lam (May 20 2020 at 11:28):

If I understand coe correctly, Lean will coerce the first one if it has_coe, the second one if it has_lift. There is

@[priority 10] instance cast_coe : has_coe  α := nat.cast

So the Nat to Int coercion works. But in data.finset, there's has_lift (finset α) (set α) but not has_coe (finset α) (set α), so the first one doesn't work.

Gabriel Ebner (May 20 2020 at 12:00):

Note that cast_coe has changed recently, it is now has_coe_t. But that doesn't have an effect on the finset coercion, which is exactly how @Shing Tak Lam described it.

@[priority 900] instance cast_coe : has_coe_t  α := nat.cast

Shing Tak Lam (May 20 2020 at 12:01):

(The folder I'm working in is on Lean 3.8.0, which is why I still have the old cast_coe)

Kenny Lau (May 20 2020 at 13:06):

why do we have such a distinction?


Last updated: Dec 20 2023 at 11:08 UTC