
I think the distance between the `type IntU` and `data IntU` is the crux of the issue. If we were forced to keep the signature and declaration together, i.e. ``` type IntU :: Bool -> Wombat data IntU a b = IntU Int ``` I wouldn't be bothered by the distance from the definition of `Wombat`. If I'm reading this code, and I already know what Wombat is, there's no problem. If I *don't* know what Wombat is, then I need to look up its definition anyway to make sense of IntU. I've never been particularly fond of Haskell's tolerance for separating signatures and definitions. It has some practical uses -- notably in combination with -XCPP it makes it easy to ensure signatures are consistent across CPP branches -- but in general I think distance between signature and definition is a smell. On Wed, Aug 11, 2021, at 03:48, Simon Peyton Jones via ghc-steering-committee wrote:
I have just posted https://github.com/ghc-proposals/ghc-proposals/pull/265#issuecomment-8966266... this, about unlifted data types. Yikes! Simon
*In accepted proposal #265 on Unlifted Datatypes https://github.com/ghc-proposals/ghc-proposals/pull/265* I have just realised that in this accepted, and implemented proposal we have done something entirely new. Consider this (from https://gitlab.haskell.org/ghc/ghc/-/issues/20204)
`type IntU :: Bool -> Wombat` ` ` `...LOTS OF CODE...` ` ` `data IntU a b = IntU Int` ` ` `...MORE CODE...` ` ` `type Wombat =Type -> TYPE UnliftedRep` The kind signature for `IntU` *completely changes the semantics of the *`*data IntU*`* declaration*, and yet can be separate from it. That is new: generally, signatures can restrict the applicability of something, but *don't change its semantics*. (Yes, with overlapping instances, certainly incoherent instances, you could change semantics, but the general principal holds.)
Even if it is adjacent, the fact that it's unlifted is quite subtle... you have to look to the right of the arrows, and then through the distant (and perhaps imported) type synonym `Wombat`.
I'm not very happy with a distant kind signature having such a profound effect on the semantics of the data type. Indeed in my comment above https://github.com/ghc-proposals/ghc-proposals/pull/265#issuecomment-5257055... I suggested a keyword
`data unlifted IntU a b = IntU Int` to signal that it's an *unlifted* data type. But then I went AWOL and didn't pursue the matter. I don't know why I was so negligent.
So this post is to ask: does anyone else think this is bizarre? I'm inclined to make a proposal to add the keyword, but I thought I'd test the waters first.
_______________________________________________ ghc-steering-committee mailing list ghc-steering-committee@haskell.org https://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-steering-committee