
6 Sep
2020
6 Sep
'20
6:19 p.m.
On Sun, 6 Sep 2020, Ignat Insarov wrote:
So, polymorphic types are not good enough to update. But see further:
λ data Z α = Z {z₁, z₂ ∷ α} λ defaultZ = Z {z₁ = mempty, z₂ = mempty} λ :type (defaultZ ∷ ∀ α. Monoid α ⇒ Z α) {z₁ = "c"} (defaultZ ∷ ∀ α. Monoid α ⇒ Z α) {z₁ = "c"} :: Z [Char]
— So when I have two fields it is suddenly fine to update a polymorphic field!
Z has only one type parameter. If you change the type of z1, you also change the type of z2. In your example with z1="c" you set the type of z1 to String, but you also claim that the result is consistently typed, thus z2 must also have type String. Since z2 was not touched, it must have the same type in defaultZ. Thus GHCi can infer the type parameter of defaultZ.