Logs: liberachat/#haskell
| 2026-01-05 00:04:40 | <haskellbridge> | <maerwald> Should we switch to 9.8 which is abandoned or to 9.10 which has two minor broken releases (including the last one)? |
| 2026-01-05 00:05:07 | → | merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl) |
| 2026-01-05 00:05:17 | <haskellbridge> | <maerwald> 'recommended' isn't for people who want to follow the latest releases. |
| 2026-01-05 00:06:57 | <haskellbridge> | <maerwald> Sorry, 9.12 is the one that's broken... I'm starting to mix up all the broken releases |
| 2026-01-05 00:10:01 | × | merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 244 seconds) |
| 2026-01-05 00:10:11 | <haskellbridge> | <sm> @maerwald that's a fine thing of course. I acknowledged the no doubt excellent reasons in the linked discussion with my thumbs up. I called it sad mainly because as an experienced haskeller I expect many difficulties building current projects or using tools, and many known limitations, with those older ghc versions. |
| 2026-01-05 00:10:15 | <haskellbridge> | <maerwald> 9.6 is documented as suitable for use: https://gitlab.haskell.org/ghc/ghc/-/wikis/GHC-status |
| 2026-01-05 00:10:41 | <haskellbridge> | <maerwald> sm: What difficulties? |
| 2026-01-05 00:12:15 | <haskellbridge> | <sm> i don't have a list handy. But in my time as a maintainer and packager I've worked around a ton of ghc version and platform specific bugs or limitations |
| 2026-01-05 00:14:21 | <haskellbridge> | <maerwald> What limitations? |
| 2026-01-05 00:14:38 | <haskellbridge> | <maerwald> Why is 9.6 more limited than 9.10? |
| 2026-01-05 00:15:58 | <haskellbridge> | <sm> I did not prepare a list in advance of this chat have forgotten them for the moment. I could go digging in my issue tracker but it's not important |
| 2026-01-05 00:18:15 | → | merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl) |
| 2026-01-05 00:19:24 | <haskellbridge> | <maerwald> If you make this claim then I think it's important |
| 2026-01-05 00:20:18 | <haskellbridge> | <sm> I mean, I would make the effort if you are truly considering bumping the recommendation. I assume you've seen them all though and will bump when you judge best |
| 2026-01-05 00:20:30 | <haskellbridge> | <maerwald> My experience in 10 years of Haskell shows that the difficulties and limitations lie within NEW GHC versions. |
| 2026-01-05 00:20:41 | <haskellbridge> | <maerwald> There's a whole github repo dedicated to it |
| 2026-01-05 00:21:07 | <haskellbridge> | <sm> of course those exist too |
| 2026-01-05 00:21:23 | <haskellbridge> | <maerwald> https://github.com/tomjaguarpaw/tilapia |
| 2026-01-05 00:21:34 | <haskellbridge> | <maerwald> And tooling works fine with 9.6 |
| 2026-01-05 00:21:46 | <haskellbridge> | <maerwald> It doesn't work as fine with new GHC versions |
| 2026-01-05 00:21:50 | <haskellbridge> | <maerwald> That's a fact |
| 2026-01-05 00:22:24 | <haskellbridge> | <maerwald> So I think your claim is wrong |
| 2026-01-05 00:23:22 | × | merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 246 seconds) |
| 2026-01-05 00:23:27 | <haskellbridge> | <sm> fair enough, I won't argue with you |
| 2026-01-05 00:25:16 | <haskellbridge> | <sm> and as always, thank you for your work, it's appreciated |
| 2026-01-05 00:27:36 | <haskellbridge> | <maerwald> But going forward, GHCup will follow GHCs official LTS releases most likely |
| 2026-01-05 00:27:53 | <haskellbridge> | <maerwald> Once they've matured, that is |
| 2026-01-05 00:28:11 | <haskellbridge> | <sm> that'll be great, I'm looking forward to it |
| 2026-01-05 00:28:52 | <haskellbridge> | <maerwald> An LTS release is decided beforehand with no knowledge about its quality. So we'll probably wait until the micro version is at 3 or higher |
| 2026-01-05 00:30:35 | <haskellbridge> | <sm> or if it's so good there's no minor release for a year, you might make an exception ? |
| 2026-01-05 00:32:08 | × | GdeVolpiano quits (~GdeVolpia@user/GdeVolpiano) (Ping timeout: 260 seconds) |
| 2026-01-05 00:32:15 | <haskellbridge> | <sm> rather unlikely I suppose |
| 2026-01-05 00:32:49 | × | zlqrvx quits (~zlqrvx@user/zlqrvx) (Quit: connection reset by purr) |
| 2026-01-05 00:32:57 | → | GdeVolpiano joins (~GdeVolpia@user/GdeVolpiano) |
| 2026-01-05 00:33:54 | → | zlqrvx joins (~zlqrvx@user/zlqrvx) |
| 2026-01-05 00:34:23 | → | merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl) |
| 2026-01-05 00:38:55 | × | merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 240 seconds) |
| 2026-01-05 00:40:17 | × | spew quits (~spew@user/spew) (Quit: nyaa~) |
| 2026-01-05 00:50:11 | → | merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl) |
| 2026-01-05 00:55:13 | × | merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 264 seconds) |
| 2026-01-05 01:05:54 | → | merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl) |
| 2026-01-05 01:06:30 | → | omidmash1 joins (~omidmash@user/omidmash) |
| 2026-01-05 01:08:47 | × | omidmash quits (~omidmash@user/omidmash) (Ping timeout: 256 seconds) |
| 2026-01-05 01:08:47 | omidmash1 | is now known as omidmash |
| 2026-01-05 01:09:49 | → | jmcantrell_ joins (~weechat@user/jmcantrell) |
| 2026-01-05 01:11:02 | × | merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 256 seconds) |
| 2026-01-05 01:20:10 | × | Tuplanolla quits (~Tuplanoll@88-114-88-95.elisa-laajakaista.fi) (Quit: Leaving.) |
| 2026-01-05 01:20:37 | <oats> | why does so much code in base and ghc use `case` for binding instead of `let` or `where`? like here: https://hackage-content.haskell.org/package/ghc-internal-9.1401.0/docs/src/GHC.Internal.Arr.html#newSTArray |
| 2026-01-05 01:21:14 | <c_wraith> | let/where create a thunk when they match on a pattern. case forces evaluation. |
| 2026-01-05 01:21:38 | <c_wraith> | > let Just x = Nothing in () |
| 2026-01-05 01:21:38 | → | merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl) |
| 2026-01-05 01:22:25 | <c_wraith> | huh. lambdabot isn't in here right now |
| 2026-01-05 01:22:53 | <EvanR> | let x = whatever in y, a thunk makes sense |
| 2026-01-05 01:23:15 | <EvanR> | but let Pattern x y z = hopefullyPattern in e ? |
| 2026-01-05 01:23:30 | <EvanR> | doesn't immediately evaluate? |
| 2026-01-05 01:23:32 | <c_wraith> | Well, anyway. (let Just x = Nothing in ()) evaluates to (). (case Nothing of Just x -> ()) is a pattern match error. |
| 2026-01-05 01:24:09 | <EvanR> | % let Just x = Nothing in () |
| 2026-01-05 01:24:09 | <yahb2> | <interactive>:153:5: warning: [GHC-53633] [-Woverlapping-patterns] ; Pattern match is redundant ; In a pattern binding: Just x = ... ; ; () |
| 2026-01-05 01:24:21 | → | lambdabot joins (~lambdabot@haskell/bot/lambdabot) |
| 2026-01-05 01:24:21 | ChanServ | sets mode +v lambdabot |
| 2026-01-05 01:24:49 | × | divlamir quits (~divlamir@user/divlamir) (Read error: Connection reset by peer) |
| 2026-01-05 01:24:57 | <c_wraith> | EvanR: Irrefutable matches just create thunks. and in a let/where, matches are irrefutable by default. |
| 2026-01-05 01:25:00 | → | divlamir joins (~divlamir@user/divlamir) |
| 2026-01-05 01:26:15 | × | merijn quits (~merijn@host-cl.cgnat-g.v4.dfn.nl) (Ping timeout: 240 seconds) |
| 2026-01-05 01:26:26 | <EvanR> | wow |
| 2026-01-05 01:27:34 | <c_wraith> | > case undefined of ~(a, b) -> () -- you can use ~ to make a match in a case irrefutable |
| 2026-01-05 01:27:35 | <lambdabot> | () |
| 2026-01-05 01:27:59 | → | jj_ joins (~apropos@node-1w7jr9pqogh9vahu1mvneock5.ipv6.telus.net) |
| 2026-01-05 01:28:00 | <oats> | % case undefined of (a,b) -> () |
| 2026-01-05 01:28:00 | <yahb2> | *** Exception: Prelude.undefined ; ; HasCallStack backtrace: ; undefined, called at <interactive>:155:6 in interactive:Ghci16 |
| 2026-01-05 01:28:11 | <int-e> | it probably got blocked by +r |
| 2026-01-05 01:28:39 | × | jj quits (~apropos@d154-20-120-135.bchsia.telus.net) (Ping timeout: 244 seconds) |
| 2026-01-05 01:28:39 | jj_ | is now known as jj |
| 2026-01-05 01:28:40 | <int-e> | (lamdbabot was perfectly alive, just not joined here) |
| 2026-01-05 01:28:50 | <c_wraith> | int-e: ah, you're still running lambdabot? I wasn't sure. |
| 2026-01-05 01:29:09 | <oats> | and irrefutable patterns are lazy? |
| 2026-01-05 01:29:40 | <oats> | % case undefined of ~(a,b) -> b |
| 2026-01-05 01:29:40 | <yahb2> | *** Exception: Prelude.undefined ; ; HasCallStack backtrace: ; undefined, called at <interactive>:157:6 in interactive:Ghci16 |
| 2026-01-05 01:29:49 | <oats> | t'would appear |
| 2026-01-05 01:29:56 | <c_wraith> | Yeah. "irrefutable" is a slightly weird way of saying "trust the programmer, you don't need to check this immediately" |
| 2026-01-05 01:30:33 | <int-e> | c_wraith: yes |
| 2026-01-05 01:31:47 | <haskellbridge> | <loonycyborg> How can you make patterns in let and where refutable? |
| 2026-01-05 01:31:49 | <haskellbridge> | <loonycyborg> Like you said they're irrefutable "by default" |
| 2026-01-05 01:32:14 | <c_wraith> | loonycyborg: You need the BangPatterns extension, then you mark the match with ! |
| 2026-01-05 01:33:17 | <haskellbridge> | <loonycyborg> Ah makes sense I guess |
| 2026-01-05 01:33:33 | <haskellbridge> | <loonycyborg> and what happens in case of non-exhaustive match at runtime? |
| 2026-01-05 01:33:45 | <haskellbridge> | <loonycyborg> Same thing as usual? |
| 2026-01-05 01:34:02 | <c_wraith> | yeah, just the usual error about a pattern match failure |
| 2026-01-05 01:34:16 | <haskellbridge> | <loonycyborg> Sometimes should be converted into "fail" |
| 2026-01-05 01:34:30 | <c_wraith> | If it's on the left side of <- in a do block, yes |
| 2026-01-05 01:34:47 | <oats> | %let Just x = (Nothing :: Maybe Int) in x |
| 2026-01-05 01:35:01 | <oats> | % let Just x = (Nothing :: Maybe Int) in x |
| 2026-01-05 01:35:01 | <yahb2> | <interactive>:159:5: warning: [GHC-53633] [-Woverlapping-patterns] ; Pattern match is redundant ; In a pattern binding: Just x = ... ; ; *** Exception: <interactive>:159:5-35: Non-exhausti... |
| 2026-01-05 01:35:13 | <haskellbridge> | <loonycyborg> but ye, irrefutable and lazy are connected. |
| 2026-01-05 01:37:06 | <haskellbridge> | <loonycyborg> Those seem to be really different things though, so it smells like some theoretical insight here could be made.. |
| 2026-01-05 01:37:12 | <int-e> | oats: as recently as GHC 8.8.4, ghc would choke on `let i = 1#` (with or without bang) |
| 2026-01-05 01:37:25 | → | merijn joins (~merijn@host-cl.cgnat-g.v4.dfn.nl) |
| 2026-01-05 01:38:10 | <c_wraith> | there are also things like GADT matching, where GHC just won't compile code that matches a GADT constructor in a let/where |
| 2026-01-05 01:38:11 | <int-e> | So up to that point, `case` was the only way to do this. `case` is also clearer about the order of operations. |
All times are in UTC.