2022/04/21

2022-04-21 00:00:01 +0200abiss27(~abiss27@user/abiss)
2022-04-21 00:02:01 +0200gehmehgeh(~user@user/gehmehgeh) (Quit: Leaving)
2022-04-21 00:02:06 +0200werneta(~werneta@137.79.218.82) (Ping timeout: 276 seconds)
2022-04-21 00:08:30 +0200mvk(~mvk@2607:fea8:5ce3:8500::46a8)
2022-04-21 00:09:37 +0200 <abastro[m]> Actual range datatype would be great
2022-04-21 00:09:50 +0200xff0x_(~xff0x@om126194210237.10.openmobile.ne.jp)
2022-04-21 00:10:17 +0200 <abastro[m]> Which can act as foldable
2022-04-21 00:14:08 +0200mikoto-chan(~mikoto-ch@213.177.151.239) (Ping timeout: 250 seconds)
2022-04-21 00:15:39 +0200[Leary](~Leary]@122-58-90-96-vdsl.sparkbb.co.nz) (Ping timeout: 240 seconds)
2022-04-21 00:19:39 +0200ubert(~Thunderbi@p200300ecdf1588a8ad1d2aec8363db05.dip0.t-ipconnect.de) (Ping timeout: 240 seconds)
2022-04-21 00:19:57 +0200ubert(~Thunderbi@p548c8d44.dip0.t-ipconnect.de)
2022-04-21 00:23:42 +0200__monty__(~toonn@user/toonn) (Quit: leaving)
2022-04-21 00:24:45 +0200tromp(~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-04-21 00:25:15 +0200justsomeguy(~justsomeg@user/justsomeguy)
2022-04-21 00:27:04 +0200Pickchea(~private@user/pickchea) (Quit: Leaving)
2022-04-21 00:28:47 +0200acidjnk(~acidjnk@p200300d0c722df425cfbfca65ef55eb7.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
2022-04-21 00:31:28 +0200tromp(~textual@dhcp-077-249-230-040.chello.nl)
2022-04-21 00:35:26 +0200Guest27(~Guest27@2601:281:d47f:1590:768c:7129:aa80:96d9)
2022-04-21 00:36:40 +0200zyklotomic(~ethan@r4-128-61-92-91.res.gatech.edu) (Ping timeout: 250 seconds)
2022-04-21 00:38:37 +0200zyklotomic(~ethan@res380d-128-61-86-145.res.gatech.edu)
2022-04-21 00:39:38 +0200 <Guest27> If I have a do-block of the form
2022-04-21 00:39:39 +0200 <Guest27> ```
2022-04-21 00:39:39 +0200 <Guest27> a <- ma
2022-04-21 00:39:40 +0200 <Guest27> b <- f a
2022-04-21 00:39:41 +0200 <Guest27> someBigOperation b
2022-04-21 00:39:41 +0200 <Guest27> ```
2022-04-21 00:39:41 +0200 <Guest27> Is this a memory leak? Is a reference to `a` being held when it isn't needed anymore?
2022-04-21 00:41:45 +0200tromp(~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-04-21 00:42:45 +0200 <geekosaur> the compiler should see it isn't needed any more
2022-04-21 00:44:17 +0200 <geekosaur> I wouldn't be surprised to see there be no reference, in fact: that could easily compile down to
2022-04-21 00:44:34 +0200 <geekosaur> @. pl undo do { a <- ma; b <- f a; someBigOperation b }
2022-04-21 00:44:35 +0200 <lambdabot> someBigOperation =<< f =<< ma
2022-04-21 00:44:38 +0200renzhi(~xp@2607:fa49:6500:b100::229c)
2022-04-21 00:46:22 +0200 <Guest27> geekosaur Thanks. If no optimizations were applied would that still be true? I'm unsure how to reason about reference lifetimes in Haskell in general
2022-04-21 00:46:52 +0200 <geekosaur> it should still be true, I think
2022-04-21 00:47:11 +0200 <geekosaur> things are held in scope by actual references, not just bindings
2022-04-21 00:47:32 +0200 <geekosaur> like avg xs = sum xs / length xs holds xs because it's used twice
2022-04-21 00:47:47 +0200 <geekosaur> but just having xs be there unused would not count as a reference
2022-04-21 00:48:00 +0200 <geekosaur> it's not a "variable" that has space allocated for it or etc.
2022-04-21 00:48:26 +0200 <Guest27> Thanks, that's a great explanation
2022-04-21 00:48:34 +0200 <geekosaur> (well, with the right coercions so that typechecks)
2022-04-21 00:52:52 +0200Guest91(~Guest91@caliga.eecs.tufts.edu)
2022-04-21 00:54:16 +0200joo-_(~joo-_@fsf/member/joo--) (Ping timeout: 248 seconds)
2022-04-21 00:54:52 +0200redb(~nmh@136.49.49.211) (Ping timeout: 260 seconds)
2022-04-21 00:54:59 +0200 <Guest91> I am a systems administrator.  I wish to install the latest set of Haskell tools -- a custom list -- centrally on my servers.  I have so far found no way to do this; everything wants to install in my home directory.  I specifically do not want anything installed in ~/.ghc or ~/.cabal, as my goal at the end of this is 'rm -rf ~/.ghc ~/.cabal' and
2022-04-21 00:55:00 +0200 <Guest91> have everything I install still present -- libraries, dependencies, documentation -- in a central directory somewhere else.  Is there documentation anywhere on how to do this?
2022-04-21 00:55:44 +0200redb(~nmh@136.49.49.211)
2022-04-21 00:55:54 +0200Tuplanolla(~Tuplanoll@91-159-69-98.elisa-laajakaista.fi) (Quit: Leaving.)
2022-04-21 00:56:11 +0200joo-_(~joo-_@80-62-117-45-mobile.dk.customer.tdc.net)
2022-04-21 00:56:11 +0200joo-_(~joo-_@80-62-117-45-mobile.dk.customer.tdc.net) (Changing host)
2022-04-21 00:56:11 +0200joo-_(~joo-_@fsf/member/joo--)
2022-04-21 00:56:18 +0200 <geekosaur> maerwald? ^^
2022-04-21 00:57:13 +0200 <geekosaur> ghcup has some options that can make it work globally, and cabal install has a strongly disrecommended --global flag. the problem with --global is it pretty much locks you into the exact versions of libraries you have installed globally
2022-04-21 00:58:15 +0200 <Guest91> This is for a class being taught; lock-in is desirable, as it makes consistent grading much easier.
2022-04-21 00:58:19 +0200 <sclv> you can install ghc itself globally, and cabal the executable globally
2022-04-21 00:58:55 +0200 <sclv> you can then cabal v1-install —global individual libs. However i really urge you not to
2022-04-21 00:59:20 +0200 <Guest91> I've tried the --global flag in various flavors.  It keeps thinking it has everything installed in my home directory and only installs the new thing in the place I've specified with --prefix --installdir and --libdir.  It's also so far barfed on trying to install ghc there.
2022-04-21 00:59:26 +0200 <sclv> Just install the tools globally and let cabal and ghc manage per user lib envs — thats how things are designed to worj
2022-04-21 00:59:28 +0200 <sclv> Work
2022-04-21 01:00:11 +0200 <Guest91> Per-user library environments are exactly the problem I'm trying to avoid.  Makes grading difficult when the instructor has no ready way to see what version the student has grabbed.  Everyone should be using the central libraries, nothing else.
2022-04-21 01:00:39 +0200 <sclv> you can say they must specify their deps in a cabal file
2022-04-21 01:01:22 +0200 <sclv> to install ghc globally dont use ghcup, use the installer directly from ghchq
2022-04-21 01:01:34 +0200 <sclv> or just use a distro package manager
2022-04-21 01:01:46 +0200 <Guest91> Distro version is too old, so installer it is.
2022-04-21 01:01:55 +0200Batzy(~quassel@user/batzy) (Quit: https://quassel-irc.org - Chat comfortably. Anywhere.)
2022-04-21 01:02:03 +0200 <sm> you could force them to use stack with a specific resolver and no extra-deps
2022-04-21 01:02:04 +0200Guest27(~Guest27@2601:281:d47f:1590:768c:7129:aa80:96d9) (Quit: Client closed)
2022-04-21 01:02:14 +0200redb(~nmh@136.49.49.211) (Ping timeout: 250 seconds)
2022-04-21 01:02:52 +0200 <Guest91> Instructor has specifically told me to use cabal, not stack.  Last I tried building stack, it would not play at all with cabal, but that was probably 3-4 years ago.  Have things improved since then, that I can install both?
2022-04-21 01:02:58 +0200 <sclv> or just give a skeleton project with a cabal file with pinned deps and tell them they can’t alter those deps
2022-04-21 01:03:41 +0200redb(~nmh@136.49.49.211)
2022-04-21 01:03:47 +0200 <exarkun> Guest91: stack uses cabal, so depending on what you mean, they play quite well together.
2022-04-21 01:04:01 +0200 <sm> you could also set up your own hackage server I guess and force them to use that. (Sounds like a lot of effort)
2022-04-21 01:04:23 +0200Batzy(~quassel@user/batzy)
2022-04-21 01:04:40 +0200 <Guest91> 'cabal install --global [umpty flags] stack' blew up in multiple ways I could not fix at the time.  Haven't tried this round, as the whole --global thing I left myself notes on from last time is no longer working.
2022-04-21 01:04:54 +0200 <geekosaur> both of them use the same mechanism to whack ghc over the head and make it use the right librariesneither stack nor cabal can see the other's sandboxed libraries. this is irrelevant if you'reinstalling everything in the global db though
2022-04-21 01:05:14 +0200 <geekosaur> whoops
2022-04-21 01:05:28 +0200 <geekosaur> neither stack nor cabal can see the other's sandboxed libraries. this is irrelevant if you'reinstalling everything in the global db though
2022-04-21 01:06:09 +0200 <Guest91> Is using the global db going to involve cabal and stack stepping on each other as I try to get a central install working?
2022-04-21 01:06:14 +0200 <geekosaur> and anything you did a few years ago with cabal install now needs to be cabal v1-install
2022-04-21 01:06:16 +0200 <sm> installing stack with cabal would be a waste of effort, there are many easier ways
2022-04-21 01:06:38 +0200 <geekosaur> (and I don't think stack can do global installs at all)
2022-04-21 01:06:47 +0200 <monochrom> ghcup can get you cabal or stack or both.
2022-04-21 01:06:55 +0200 <Guest91> I'm pretty sure the last time I invoked 'cabal install' in earnest was in 2018.
2022-04-21 01:06:59 +0200 <sclv> you're getting too much conflicting advice here from everyone. but i think stack is a red herring
2022-04-21 01:07:04 +0200 <monochrom> But there is no longer any --global
2022-04-21 01:07:22 +0200 <sclv> the first step is a global ghc -- do that by installing ghc from ghchq
2022-04-21 01:07:36 +0200 <sclv> second, get a cabal executable and place it in the global /bin
2022-04-21 01:07:36 +0200tired(~tired@user/tired) (Quit: /)
2022-04-21 01:07:40 +0200 <sclv> finally, worry about the libs
2022-04-21 01:07:53 +0200 <Guest91> Got it.  Will try that; many thanks.
2022-04-21 01:07:59 +0200redb(~nmh@136.49.49.211) (Ping timeout: 240 seconds)
2022-04-21 01:08:11 +0200 <sm> well, it's an interesting problem with many solutions, none of them easy
2022-04-21 01:08:37 +0200 <sclv> vis a vis the libs you can either "cabal v1-install --global LIBNAME" _or_ my preferred way would be to give every student a template cabal project with the allowed libs pinned and just tell them "don't alter em"
2022-04-21 01:08:45 +0200 <Guest91> This is why I take notes.  But my notes are no good, which was leading me to getting a flat spot on my forehead.
2022-04-21 01:09:04 +0200tired(~tired@user/tired)
2022-04-21 01:09:16 +0200 <sclv> a lot has changed in the last few years, so it requires thinking through the goals again based on the current state of tools
2022-04-21 01:09:22 +0200geekosaur(~geekosaur@xmonad/geekosaur) (Remote host closed the connection)
2022-04-21 01:09:24 +0200redb(~nmh@136.49.49.211)
2022-04-21 01:09:25 +0200Unicorn_Princess(~Unicorn_P@93-103-228-248.dynamic.t-2.net) (Remote host closed the connection)
2022-04-21 01:09:37 +0200 <sm> haskell notes decay in about six months :)
2022-04-21 01:10:15 +0200 <Guest91> ...and these last worked in July 2018.  Well decayed by now.
2022-04-21 01:10:55 +0200 <Guest91> OK, off to run the steps sclv listed.  Thanks!
2022-04-21 01:11:12 +0200geekosaur(~geekosaur@xmonad/geekosaur)
2022-04-21 01:11:23 +0200 <sm> I would suggest an amendment, start with ghcup. Why wouldn't you
2022-04-21 01:12:57 +0200 <Guest91> I already tried ghcup.  It put ghc in my home directory along with all the other tools.  I then tried using the cabal that came with to 'cabal install --global [umpty path flags] ghc', which failed with a version conflict on the first dependency it tried.
2022-04-21 01:13:22 +0200 <Guest91> Unfortunately, the specific error is out of my scrollback, so I'd have to rebuild that whole sequence to reproduce it.
2022-04-21 01:13:39 +0200bontaq(~user@ool-45779fe5.dyn.optonline.net) (Ping timeout: 240 seconds)
2022-04-21 01:14:01 +0200 <sm> Guest91: ah right, you don't want things installed in $HOME
2022-04-21 01:14:02 +0200DNH(~DNH@2a02:8109:b740:2c4:39b1:39b8:aa61:2e31) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2022-04-21 01:14:08 +0200 <Guest91> Not even a little bit.
2022-04-21 01:14:15 +0200redb(~nmh@136.49.49.211) (Ping timeout: 256 seconds)
2022-04-21 01:14:42 +0200 <sm> cabal install-ing ghc would be crazy, unless you are really intent on building everything from source ?
2022-04-21 01:15:10 +0200redb(~nmh@136.49.49.211)
2022-04-21 01:15:28 +0200 <Guest91> That's certainly how I've done it in the past.  Using the distro elderly ghc to bootstrap my way up to latest, then grabbing a cabal binary and doing the same with that, then installing tools.
2022-04-21 01:15:45 +0200 <jackdk> If you want this level of control, have you considered Nix?
2022-04-21 01:16:19 +0200 <Guest91> I don't know Nix.  nix-shell ?
2022-04-21 01:16:20 +0200 <sm> I see... what about GHC binaries from haskell.org/ghc ?
2022-04-21 01:16:49 +0200 <Guest91> Part of the problem here is that I'm a sysadmin -- I am not a Haskell user.  I put stuff in place, other people use it.
2022-04-21 01:17:19 +0200 <sm> maerwald: does/should ghcup have an option to install things elsewhere than $HOME ?
2022-04-21 01:19:17 +0200 <Guest91> Hah, having just looked at the binary distros on haskell.org, my OS isn't there -- RHEL 8.  I suspect I'm going to have to build at least ghc from source regardless.
2022-04-21 01:19:47 +0200 <Guest91> With luck my notes for that haven't decayed quite so badly.
2022-04-21 01:20:13 +0200 <sm> note, `cabal install ghc` does not install GHC, but the `ghc` API package
2022-04-21 01:20:33 +0200 <Guest91> Aha, useful to know.  Thank you.  I was figuring it was the compiler itself.
2022-04-21 01:21:08 +0200 <sm> and perhaps you don't need a RHEL 8 specific binary ? Just Linux (ARCH)
2022-04-21 01:21:22 +0200chenqisu1(~chenqisu1@183.217.200.38)
2022-04-21 01:21:46 +0200 <Guest91> We put things in weird places to avoid disturbing the system binaries & libraries, so I often need to build to make sure that any baked-in paths are correct.
2022-04-21 01:22:44 +0200 <sm> you have a fun job don't you :)
2022-04-21 01:23:10 +0200 <Guest91> Academic sysadmin!  It has its moments.  Dealing with Haskell and cabal are... not my favorite, I must say.
2022-04-21 01:23:33 +0200 <sm> I was going to throw docker into the mix...
2022-04-21 01:24:27 +0200redb(~nmh@136.49.49.211) (Ping timeout: 256 seconds)
2022-04-21 01:24:29 +0200 <Guest91> So far managed to avoid that one.  We use VMWare to good effect, and have handed user-level docker privs on specific machines to the three users who so far have required that.
2022-04-21 01:25:01 +0200cawfee(~root@2406:3003:2077:2758::babe) (Ping timeout: 240 seconds)
2022-04-21 01:25:15 +0200cosimone(~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20) (Ping timeout: 260 seconds)
2022-04-21 01:25:41 +0200redb(~nmh@136.49.49.211)
2022-04-21 01:25:43 +0200cosimone`(~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20)
2022-04-21 01:25:59 +0200geekosaurhas been there
2022-04-21 01:26:09 +0200 <Guest91> Yup, here's the ghc bootstrapping I was expecting.  Can't build 9.2.2 with my distro's version 8.2.2.  Interstitial versions, here I come...
2022-04-21 01:26:13 +0200kronicma1(user73386@neotame.csclub.uwaterloo.ca) (Ping timeout: 240 seconds)
2022-04-21 01:26:29 +0200 <geekosaur> bindist shouldn't need to bootstrap
2022-04-21 01:26:35 +0200 <geekosaur> did I miss something?
2022-04-21 01:26:40 +0200 <sm> ohh so old. I would definitely be trying the 9.2.2 binaries
2022-04-21 01:27:09 +0200 <geekosaur> (managed cluster and grad student machines for Carnegie Mellon ECE for a decade, around a decade ago)
2022-04-21 01:27:27 +0200kronicma1(user92502@neotame.csclub.uwaterloo.ca)
2022-04-21 01:27:34 +0200 <geekosaur> ECE, so no compiler stuff unless you count Verilog
2022-04-21 01:28:19 +0200 <Guest91> geekosaur no bindist for RHEL 8, and I'm already leery of our odd install pathing, so bootstrapping my way from 8.2.2 to 9.2.2.
2022-04-21 01:28:37 +0200cawfee(~root@2406:3003:2077:2758::babe)
2022-04-21 01:29:37 +0200 <monochrom> Are you sure the one for Fedora 27 isn't good enough?
2022-04-21 01:29:53 +0200 <monochrom> Are you already on https://www.haskell.org/ghc/download_ghc_9_2_2.html#linux_x86_64 ?
2022-04-21 01:30:09 +0200 <geekosaur> RHEL is usually fairly old, so probably it's not
2022-04-21 01:30:23 +0200redb(~nmh@136.49.49.211) (Ping timeout: 260 seconds)
2022-04-21 01:30:26 +0200 <monochrom> OK yikes
2022-04-21 01:30:35 +0200 <geekosaur> had to deal with RHEL at my last job, it makes Debian look like rolling release
2022-04-21 01:31:03 +0200 <Guest91> RHEL 8 is based on Fedora 28, might work.  But I've done bootstrap in the past to good effect, so bootstrap here should -- I hope! -- still work.
2022-04-21 01:31:07 +0200 <monochrom> Perhaps CentOS 7 is closer?
2022-04-21 01:31:17 +0200 <sm> since you already succeeded installing a modern ghc with ghcup: there's also the option of doing that and just moving it
2022-04-21 01:31:26 +0200redb(~nmh@136.49.49.211)
2022-04-21 01:31:30 +0200 <geekosaur> that should be since CentOS is more or less free RHEL
2022-04-21 01:31:36 +0200 <geekosaur> *should be OK
2022-04-21 01:32:54 +0200 <Guest91> sm: no baked in paths to worry about?  I've been bit by that on various occasions.
2022-04-21 01:33:01 +0200 <monochrom> At any rate they are built for you to just say "./configure --prefix=/foo/bar && make install" so you can choose whatever /foo/bar you want, maximum flexibility.
2022-04-21 01:33:16 +0200 <sm> I don't know, but I sure would give it a try before bootstrapping through multiple GHC versions on an ancient system
2022-04-21 01:33:35 +0200 <monochrom> There are install-time bake-in paths.
2022-04-21 01:33:48 +0200 <geekosaur> ghc doesn't bake in paths, and you'll find that an installed ghc uses wrapper scripts which pass -B options to find itself
2022-04-21 01:33:50 +0200 <monochrom> But they are install-time.
2022-04-21 01:34:13 +0200 <geekosaur> at need you can edit the wrappers
2022-04-21 01:34:58 +0200 <geekosaur> oh, package db registrations have baked-in paths also. but you can edit the registration files and then run ghc-pkg recache --global
2022-04-21 01:35:13 +0200zebrag(~chris@user/zebrag) (Quit: Konversation terminated!)
2022-04-21 01:35:29 +0200 <monochrom> That gets out of hand quickly.
2022-04-21 01:35:38 +0200 <Guest91> Eh, I have 8.6.5 building with 8.2.2.  Next up: 8.10.7, and then 9.2.2.  I vaguely remember not being able to skip quite so many versions last time I did this.
2022-04-21 01:35:51 +0200 <geekosaur> hopefully it's only done once while provisioning the machine
2022-04-21 01:36:01 +0200 <monochrom> I mean for those of us who deeply understand how GHC organizes itself it looks "trivial".
2022-04-21 01:36:27 +0200ec(~ec@gateway/tor-sasl/ec)
2022-04-21 01:37:13 +0200 <geekosaur> Guest91, somewhere mid-8.x ghc went from "support one prior version" to "support two prior versions"
2022-04-21 01:37:28 +0200 <Guest91> That'd explain it.  Much appreciated!
2022-04-21 01:37:36 +0200 <monochrom> I use ghcup but I pull a GHCUP_INSTALL_BASE_PREFIX=/usr/local trick. :)
2022-04-21 01:37:37 +0200redb(~nmh@136.49.49.211) (Ping timeout: 246 seconds)
2022-04-21 01:37:54 +0200 <sm> monochrom: ah, there it is, nice
2022-04-21 01:38:00 +0200zer0bitz(~zer0bitz@2001:2003:f444:8f00:9093:7e91:d33a:2c42) (Ping timeout: 248 seconds)
2022-04-21 01:38:04 +0200 <Guest91> Hm!  I may try that separately while this interstitial is building.
2022-04-21 01:38:25 +0200 <Guest91> It'll probably still leave me a pile of things in ~/.ghc and ~/.cabal.
2022-04-21 01:38:34 +0200 <monochrom> But then it means /usr/local/.ghcup (generally $GHCUP_INSTALL_BASE_PREFIX/.ghcup).
2022-04-21 01:38:39 +0200 <Guest91> Ooog.
2022-04-21 01:38:56 +0200 <monochrom> But no matter, I then set up symlinks to get nicer directory names.
2022-04-21 01:39:09 +0200redb(~nmh@136.49.49.211)
2022-04-21 01:39:57 +0200 <Guest91> Our install paths are weird because we install everything into a per-version directory and then symlink into a common bin & lib & other stuff directory set.  Lets us keep old versions around in case someone is relying on them.
2022-04-21 01:40:07 +0200 <geekosaur> yup
2022-04-21 01:40:17 +0200 <monochrom> ghcup does that internally too.
2022-04-21 01:40:35 +0200 <Guest91> But many things look askance at being installed into a directory like /usr/local/ghc-9.2.2, which is why I'm leery of binary distros.
2022-04-21 01:40:54 +0200jgeerds(~jgeerds@d53604b0.access.ecotel.net) (Ping timeout: 276 seconds)
2022-04-21 01:41:04 +0200 <geekosaur> ghc's "binary distro" has a configure script
2022-04-21 01:41:06 +0200 <monochrom> Although, to be fair, "does it internally" also means not according to your established scheme.
2022-04-21 01:41:18 +0200 <sclv> i'd also check if the prof really wants 9.2.2 -- the stable-tho-somewhat-old version still in production many places is 8.10.7
2022-04-21 01:41:41 +0200 <sm> +1
2022-04-21 01:41:43 +0200 <jackdk> I am aware of at least one academic institution that's still teaching with 8.6.5
2022-04-21 01:41:48 +0200 <Guest91> Latest release by request!  That much I know.
2022-04-21 01:41:53 +0200 <geekosaur> and 9.2.2 did change some details of parsing
2022-04-21 01:42:06 +0200 <monochrom> Yes you should make the prof decide on the version and sign it black and white and witnessed by a lawyer and a justice of peace.
2022-04-21 01:42:16 +0200 <geekosaur> notably spaces arenowrequires in someplaces where they were optional
2022-04-21 01:42:24 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net)
2022-04-21 01:42:26 +0200 <geekosaur> *are now required
2022-04-21 01:42:30 +0200 <Guest91> The prof is quite good about being consistent on these things.  One of our best customers in that regard.
2022-04-21 01:42:53 +0200 <sm> but hey, if 9.2.2 is acceptable it's faster and probably nicer all round and why not save a bunch of students some pain
2022-04-21 01:43:18 +0200 <Guest91> And I'll have 8.10.7 as an interstitial anyhow, so I might as well keep it.
2022-04-21 01:43:55 +0200redb(~nmh@136.49.49.211) (Ping timeout: 260 seconds)
2022-04-21 01:44:54 +0200redb(~nmh@136.49.49.211)
2022-04-21 01:45:22 +0200 <monochrom> But yeah putting different versions in different directories is a good idea.
2022-04-21 01:46:06 +0200raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 276 seconds)
2022-04-21 01:46:09 +0200 <jackdk> When you have time, I think you should give Nix (not the whole OS, just the package manager/build tool/floor wax) a good look - its whole point is that everything it builds lives under /nix/store, with a lot of work going into hardcoding rpaths etc such that it's not depending on system libs etc. Not sure if they support RHEL 8 though.
2022-04-21 01:46:32 +0200 <Guest91> jackdk: I'll have a look while I'm building these interstitials.
2022-04-21 01:46:52 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net) (Ping timeout: 250 seconds)
2022-04-21 01:46:52 +0200russruss(~russruss@my.russellmcc.com) (Ping timeout: 250 seconds)
2022-04-21 01:47:09 +0200cynomys(~cynomys@user/cynomys)
2022-04-21 01:47:11 +0200 <jackdk> It also seems like a useful thing to have for reproducible science
2022-04-21 01:47:44 +0200 <geekosaur> downside is you end up with Nix-flavored duplicates of half your system libraries
2022-04-21 01:47:54 +0200 <Guest91> Yup.  Another reason I dislike the default behavior of cabal putting everything in $HOME.
2022-04-21 01:48:04 +0200 <geekosaur> as a sysadmin I find that annoying
2022-04-21 01:48:43 +0200 <monochrom> I'm a sysadmin-wannabe so I have some of that sentiment too.
2022-04-21 01:49:12 +0200 <monochrom> Although, I'm sysadminning for just one user (myself) so I am not really impacted.
2022-04-21 01:49:28 +0200redb(~nmh@136.49.49.211) (Ping timeout: 250 seconds)
2022-04-21 01:50:23 +0200 <sibnull[m]> I'm a developer, and NixOS is great, because all the sysamin stuff is basically outsourced to professionals, and all I do is reproduce their curated configuration on my computer.
2022-04-21 01:50:40 +0200redb(~nmh@136.49.49.211)
2022-04-21 01:53:12 +0200 <geekosaur> I think nix*os* makes more sense than nix itself
2022-04-21 01:53:58 +0200 <geekosaur> specifically because nix has to duplicate the host system to ensure its curated configuration is used
2022-04-21 01:55:06 +0200redb(~nmh@136.49.49.211) (Ping timeout: 250 seconds)
2022-04-21 01:56:26 +0200redb(~nmh@136.49.49.211)
2022-04-21 02:00:12 +0200 <Guest91> One other thing I did notice while messing around with the cabal that ghcup gave me: the --enable-tests and --run-tests flags no longer worked for things I told cabal to install.  Is that something that works again in the latest version of cabal, or is that set of flags now repurposed?
2022-04-21 02:00:15 +0200littlebobeep(~alMalsamo@gateway/tor-sasl/almalsamo) (Ping timeout: 240 seconds)
2022-04-21 02:00:44 +0200redb(~nmh@136.49.49.211) (Ping timeout: 250 seconds)
2022-04-21 02:00:46 +0200 <sclv> old behavior is with v1-install
2022-04-21 02:00:54 +0200jerry99(~339ea683@cerf.good1.com) (Quit: CGI:IRC (Ping timeout))
2022-04-21 02:00:59 +0200 <sclv> new behavior is a totally different workflow.
2022-04-21 02:01:02 +0200 <Guest91> OK, guess I'll be using v1-install a lot then.
2022-04-21 02:01:24 +0200 <sclv> right. new is an extremely per-user workflow
2022-04-21 02:01:46 +0200 <Guest91> Or is there a way in the new workflow to get the test suites to run for the thing I'm installing and all the deps too?
2022-04-21 02:01:51 +0200 <sclv> you should warn the prof that in a few years we will be new behavior only
2022-04-21 02:02:03 +0200 <Guest91> Will do.
2022-04-21 02:02:12 +0200redb(~nmh@136.49.49.211)
2022-04-21 02:02:33 +0200 <sclv> in the new workflow “installing” a lib is a fiction. its project based and manages lib deps behind the scenes
2022-04-21 02:02:34 +0200 <Guest91> Also, I fear that if I'm doing this again in four years, I may end up bald from ripping out my own hair.
2022-04-21 02:02:58 +0200 <Guest91> Ooof.  No obvious way to work with a central setup there at all.
2022-04-21 02:03:21 +0200 <sclv> they should move to a teaching plan based on projects with fixed deps, and not try to centrally manage libs
2022-04-21 02:03:43 +0200 <sclv> it doesn’t make things pedagogically harder, and teaches a modern approach
2022-04-21 02:03:44 +0200xff0x_(~xff0x@om126194210237.10.openmobile.ne.jp) (Read error: Connection reset by peer)
2022-04-21 02:04:08 +0200 <geekosaur> note that a stack resolver or a cabal freeze file will do almost all of what your prof wants, and both work with a modern workflow
2022-04-21 02:04:33 +0200stackdroid18(14094@user/stackdroid) ()
2022-04-21 02:04:36 +0200 <Guest91> Got bit years ago like that with Ruby when CVE-2009-1904 dropped and one web app we had was carrying around its own version of every gem instead of using system ones.  We ended up just killing the app outright.
2022-04-21 02:04:39 +0200 <sclv> Or just giving a skeleton project with the deps already fixed
2022-04-21 02:04:49 +0200 <sclv> just have the students git clone it and off they fo
2022-04-21 02:05:59 +0200 <geekosaur> Guest91, you'd be bitten by that with Haskell anyway because of cross-module inlining
2022-04-21 02:06:15 +0200 <geekosaur> even if you replace the global one you *still* have to recompile everything that uses it
2022-04-21 02:06:26 +0200 <Guest91> Hah, I am warned.  So far nobody's tried putting up Haskell code on the web server, though.
2022-04-21 02:07:57 +0200jerry99(~339ea102@cerf.good1.com)
2022-04-21 02:08:04 +0200 <Guest91> Python, Ruby, Perl, PHP, JavaScript, sure.  No Haskell.
2022-04-21 02:08:09 +0200abiss27(~abiss27@user/abiss) (Quit: hasta la vista... tchau!)
2022-04-21 02:10:39 +0200gurkenglas(~gurkengla@dslb-178-012-018-212.178.012.pools.vodafone-ip.de) (Ping timeout: 240 seconds)
2022-04-21 02:15:21 +0200chomwitt(~chomwitt@2a02:587:dc1b:da00:41cd:5357:91a5:6) (Ping timeout: 248 seconds)
2022-04-21 02:16:31 +0200 <Guest91> Thanks for all the help and pointers.  I'm going to leave this build of 8.6.5 running and pick up tomorrow.
2022-04-21 02:17:40 +0200pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Quit: WeeChat 3.5)
2022-04-21 02:17:43 +0200ralu1(~ralu@static.211.245.203.116.clients.your-server.de) (Ping timeout: 256 seconds)
2022-04-21 02:19:22 +0200mvk(~mvk@2607:fea8:5ce3:8500::46a8) (Ping timeout: 250 seconds)
2022-04-21 02:21:44 +0200euandreh(~euandreh@2804:14c:33:9fe5:2165:73d6:1630:f174) (Ping timeout: 260 seconds)
2022-04-21 02:31:36 +0200machinedgod(~machinedg@24.105.81.50) (Ping timeout: 276 seconds)
2022-04-21 02:36:57 +0200Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer)
2022-04-21 02:38:25 +0200wroathe(~wroathe@206-55-188-8.fttp.usinternet.com)
2022-04-21 02:38:26 +0200wroathe(~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
2022-04-21 02:38:26 +0200wroathe(~wroathe@user/wroathe)
2022-04-21 02:40:56 +0200deadmarshal_(~deadmarsh@95.38.229.55)
2022-04-21 02:41:37 +0200 <monochrom> The problem with cabal/stack-project-based at school for student accounts is that schools give student accounts very limited disk quota.
2022-04-21 02:41:57 +0200 <monochrom> I have had students exceeding disk quota just by a "cabal update".
2022-04-21 02:42:44 +0200 <monochrom> The error message did not say that either, too.
2022-04-21 02:43:34 +0200 <monochrom> Multiple students got that problem before the nth one cleverly discovered it was a "disk out of space" error.
2022-04-21 02:45:25 +0200 <monochrom> My solution for now is that I don't involve anything that doesn't come with GHC. Hell I rolled my own unit-test library and include it in every assignment. "cabal repl --build-depends HUnit" is out of the question, see above.
2022-04-21 02:45:54 +0200deadmarshal_(~deadmarsh@95.38.229.55) (Ping timeout: 276 seconds)
2022-04-21 02:46:05 +0200 <sclv> gak
2022-04-21 02:46:21 +0200 <sclv> nix would work but its awful heavyweight
2022-04-21 02:47:09 +0200 <monochrom> My previous solution was I did manual dependency chasing for HUnit and prepared a zip file containing HUnit's tarball, its dependencies' tarballs, and a shell script. The shell script called "runghc Setup.hs build/copy/register" in the right order. At least it took much less disk space.
2022-04-21 02:47:34 +0200 <sclv> i think that a "local hackage" would be like that but nicer
2022-04-21 02:47:37 +0200 <monochrom> I am not my school's sysadmin, I cannot just decree "nix".
2022-04-21 02:48:06 +0200 <sclv> there's a tool that's in development iirc that makes bundling up a "local hackage" easier
2022-04-21 02:48:37 +0200 <sclv> students would still have the hit of building at least once the libs they needed and the on-disk binary cost of that
2022-04-21 02:48:53 +0200 <sclv> but thats much smaller than the footprint of a full 01-index tarball
2022-04-21 02:50:55 +0200mmhat(~mmh@55d4917e.access.ecotel.net) (Quit: WeeChat 3.5)
2022-04-21 02:52:36 +0200 <dolio> Isn't cabal v1-update going to blow up the disks, too?
2022-04-21 02:53:08 +0200 <dolio> It's the same list of packages.
2022-04-21 02:53:12 +0200 <sclv> with a local hackage it won't :-)
2022-04-21 02:53:25 +0200lbseale(~ep1ctetus@user/ep1ctetus) (Read error: Connection reset by peer)
2022-04-21 02:53:32 +0200 <sclv> otherwise i think the idea is all these other solutions avoid ever having to update, by having all the packages distributed directly
2022-04-21 02:53:33 +0200 <dolio> Well, right.
2022-04-21 02:53:33 +0200euandreh(~euandreh@2804:14c:33:9fe5:2165:73d6:1630:f174)
2022-04-21 02:53:58 +0200 <dolio> Yeah, you can use a project file with all the dependencies in a repo or something.
2022-04-21 02:54:32 +0200 <dolio> Presumably.
2022-04-21 02:59:20 +0200 <jackdk> monochrom: yeah, this disk quota issue will become a serious problem for teaching Haskell soon, unless you want to confine yourself to included packages.
2022-04-21 02:59:55 +0200xff0x_(~xff0x@125x102x200x106.ap125.ftth.ucom.ne.jp)
2022-04-21 03:00:48 +0200 <jackdk> dolio: The way one academic institution did this was the lab base image did a bunch of cabal v1-install of everything the courses needed at start of semester, all at once, and this provided packages in the global db so cabal v2-install would solve and find them
2022-04-21 03:01:41 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net)
2022-04-21 03:01:58 +0200kristjansson(sid126207@id-126207.tinside.irccloud.com) (Excess Flood)
2022-04-21 03:02:20 +0200kristjansson(sid126207@id-126207.tinside.irccloud.com)
2022-04-21 03:02:22 +0200Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi)
2022-04-21 03:04:14 +0200dmenz(~dmenz@2804:14d:5cd4:8125:9e31:dbe9:5043:1a2e)
2022-04-21 03:04:33 +0200 <abastro[m]> Oh, Haskell build tool is still not ideal
2022-04-21 03:04:50 +0200jerry99(~339ea102@cerf.good1.com) (Quit: CGI:IRC)
2022-04-21 03:05:09 +0200jerry99(~339ea102@cerf.good1.com)
2022-04-21 03:05:20 +0200 <abastro[m]> Btw can I maintain a cabal store independent of user?
2022-04-21 03:05:41 +0200 <abastro[m]> So that I would have other users capable of accessing it
2022-04-21 03:06:05 +0200 <monochrom> cabal assumes write permissions fundamentally.
2022-04-21 03:06:38 +0200 <abastro[m]> Ouch
2022-04-21 03:07:08 +0200 <monochrom> Hell, cabal assumes single user fundamentally.
2022-04-21 03:07:33 +0200 <abastro[m]> Why is cabal so bas
2022-04-21 03:07:36 +0200cesar-(~cesar@2600:1700:9490:79f0::f)
2022-04-21 03:07:39 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net) (Remote host closed the connection)
2022-04-21 03:07:40 +0200 <abastro[m]> s/bas/bad
2022-04-21 03:08:05 +0200 <abastro[m]> It somewhat wastes disk spaces
2022-04-21 03:08:23 +0200 <jackdk> Because package management is a hard problem
2022-04-21 03:08:45 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net)
2022-04-21 03:08:59 +0200 <abastro[m]> At least ability to link the built packages would be great..
2022-04-21 03:09:22 +0200 <sclv> a read only store is perfectly reasonable
2022-04-21 03:09:34 +0200 <sclv> there’s just some manual plumbing involved
2022-04-21 03:10:14 +0200 <abastro[m]> Wish "Read only stores linked from personal store" was easier
2022-04-21 03:10:26 +0200dmenz(~dmenz@2804:14d:5cd4:8125:9e31:dbe9:5043:1a2e) (Quit: Leaving)
2022-04-21 03:11:23 +0200vysn(~vysn@user/vysn)
2022-04-21 03:11:28 +0200 <abastro[m]> If haskell had more manpower, cabal would not be in such a state, right?
2022-04-21 03:11:36 +0200 <abastro[m]> I heard of how great rust package manager is
2022-04-21 03:12:12 +0200 <sclv> there’s virtually no demand for the thing you’re asking for
2022-04-21 03:12:18 +0200werneta(~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net)
2022-04-21 03:12:59 +0200 <sclv> academic labs are a very strange and particular case. it would be good to support them better, but its not a normal development workfloe
2022-04-21 03:13:23 +0200 <abastro[m]> Well, I mean, even I want to limit disk space usage
2022-04-21 03:13:33 +0200 <monochrom> 01-index.tar is the fundamental bottleneck. (Build products are dwarved by that.) I don't know that cargo or pip or gem... are really doing better there.
2022-04-21 03:13:54 +0200 <sclv> but what you are asking for is unrelated to single user disk usage
2022-04-21 03:13:55 +0200 <abastro[m]> Oh?
2022-04-21 03:13:59 +0200 <abastro[m]> How big is 01-index.tar
2022-04-21 03:14:30 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net) (Ping timeout: 276 seconds)
2022-04-21 03:14:36 +0200 <abastro[m]> I thought built packages take the most of the space
2022-04-21 03:14:40 +0200 <abastro[m]> But index file?
2022-04-21 03:14:44 +0200 <sclv> a fixed shared store is about one computer with Many users
2022-04-21 03:14:47 +0200neurocyte8614492(~neurocyte@user/neurocyte) (Ping timeout: 240 seconds)
2022-04-21 03:15:20 +0200 <abastro[m]> Yep
2022-04-21 03:15:31 +0200 <sclv> no modern compiled language goes easy on disk afaik.
2022-04-21 03:15:49 +0200 <abastro[m]> I mean
2022-04-21 03:15:54 +0200 <davean> abastro[m]: Why do you think this isn't how all the other ones work?
2022-04-21 03:15:56 +0200 <sclv> and arguably even noncompiled languages get nutty with large dep trees
2022-04-21 03:16:06 +0200 <abastro[m]> One could perhaps have one for each computer
2022-04-21 03:16:42 +0200 <sclv> one what? one store? if you have a single user on each computer, you Do
2022-04-21 03:16:54 +0200 <abastro[m]> And then one computer for many users shared
2022-04-21 03:17:05 +0200 <sclv> *facepalm*
2022-04-21 03:17:20 +0200 <abastro[m]> I mean, why would disk quotas be small here
2022-04-21 03:17:51 +0200 <abastro[m]> Isn't it because each computer is shared by lots of users?
2022-04-21 03:18:25 +0200 <sclv> Yes. and as i said a teaching lab is a unique case, not common to any standard modern development env
2022-04-21 03:18:58 +0200 <abastro[m]> Sorry but could you explain more about teaching lab?
2022-04-21 03:19:12 +0200andrey(~andrey@p200300dbcf0d4c00ca7da127e9eab0e0.dip0.t-ipconnect.de)
2022-04-21 03:19:45 +0200 <abastro[m]> I thought of a typical cloud environment running on server where each computers are shared by many users
2022-04-21 03:19:56 +0200 <abastro[m]> Guess this case is a bit different?
2022-04-21 03:20:09 +0200 <sclv> a typical cloud env is nothing like that
2022-04-21 03:20:29 +0200 <abastro[m]> Eh?
2022-04-21 03:20:49 +0200 <abastro[m]> I mean, it's not like one user is assigned entire computer
2022-04-21 03:21:10 +0200 <sclv> the “cloud” usually gives individual users/orgs an entire virtual computer that secretly is running on shared hardware
2022-04-21 03:21:28 +0200andrey_(~andrey@p200300dbcf0690007a1a8916775a33e5.dip0.t-ipconnect.de) (Ping timeout: 248 seconds)
2022-04-21 03:21:30 +0200 <sclv> you don’t have a linux install with 100+ accounts able to login
2022-04-21 03:21:43 +0200 <abastro[m]> Yea
2022-04-21 03:21:44 +0200 <abastro[m]> Yep.. oh wait
2022-04-21 03:21:44 +0200 <abastro[m]> Isn't it the same situation?
2022-04-21 03:21:46 +0200 <abastro[m]> Oh right
2022-04-21 03:21:49 +0200 <abastro[m]> Wait
2022-04-21 03:22:08 +0200 <abastro[m]> Isn't virtualization exactly for this thing
2022-04-21 03:23:17 +0200 <abastro[m]> Virtual computer giving illusion of owning the computer when it doesn't, actually.
2022-04-21 03:23:59 +0200 <monochrom> Here is the real difference between cloud and school student account:
2022-04-21 03:24:56 +0200 <monochrom> The cloud gives you 100GB disk space and charges you I don't know a hundred dollars per year maybe.
2022-04-21 03:25:04 +0200 <abastro[m]> Now I realized what you mean, so in the academic lab, one computer OS comes with many users... whhhh
2022-04-21 03:25:24 +0200 <monochrom> The schoold gives you 100MB disk space and charges you I don't know ten thousand dollars per year maybe. >_<
2022-04-21 03:25:32 +0200 <sclv> lmao
2022-04-21 03:25:58 +0200 <abastro[m]> Wat
2022-04-21 03:25:59 +0200 <abastro[m]> Ten thousands lul
2022-04-21 03:26:15 +0200 <abastro[m]> "We don't have that money, it needs to go into constructing buildings"
2022-04-21 03:26:24 +0200 <abastro[m]> Tho I think lots of startups begin with free version which doesn't give much disk space
2022-04-21 03:26:39 +0200 <monochrom> I think it's 7000 cdn$ in Canadian universities. And the US is strictly more expensive.
2022-04-21 03:26:42 +0200 <abastro[m]> Also free versions does provide like 10GB at least
2022-04-21 03:26:55 +0200 <abastro[m]> Or was ir 100GB
2022-04-21 03:26:59 +0200 <abastro[m]> Now I guess I see
2022-04-21 03:27:16 +0200 <abastro[m]> Disk spaces are cheap but uni cannot somehow afford it. Wow?
2022-04-21 03:27:56 +0200 <abastro[m]> (I thought my uni was more conventional, it often gives us 10GB disk space at least as well. Enough to run small haskell project)
2022-04-21 03:28:00 +0200 <sclv> Willing to bet that cloud providers somehow have fewer middle manager administrators than campuses these days
2022-04-21 03:28:23 +0200 <monochrom> Anyway it's somewhat below $10k in Canada and somewhat above $10k in US so let's say the "average" is $10k heh. (yay ballparks.)
2022-04-21 03:29:00 +0200 <monochrom> To be fair, $10k at a university also buys you courses, not just a computer account.
2022-04-21 03:29:17 +0200 <monochrom> Right? I want to make money too!
2022-04-21 03:29:36 +0200 <monochrom> And my TAs want to make money too.
2022-04-21 03:29:42 +0200 <monochrom> It all adds up quickly.
2022-04-21 03:30:04 +0200 <monochrom> But I just like the comedy of comparing cloud with school accounts >:)
2022-04-21 03:32:55 +0200xkuru(~xkuru@user/xkuru) (Read error: Connection reset by peer)
2022-04-21 03:33:19 +0200vysn(~vysn@user/vysn) (Ping timeout: 240 seconds)
2022-04-21 03:35:13 +0200[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470) (Ping timeout: 246 seconds)
2022-04-21 03:35:53 +0200Me-me(~me-me@v.working.name) (Quit: Disconnecting on purpose.)
2022-04-21 03:35:57 +0200AlexNoo_(~AlexNoo@178.34.161.31)
2022-04-21 03:36:22 +0200Me-me(~me-me@tunnel690570-pt.tunnel.tserv12.mia1.ipv6.he.net)
2022-04-21 03:37:07 +0200AlexNoo(~AlexNoo@178.34.161.31) (Read error: Connection reset by peer)
2022-04-21 03:37:25 +0200 <abastro[m]> Well you do need to state the problematic side
2022-04-21 03:37:32 +0200 <abastro[m]> BUILDINGS!!
2022-04-21 03:37:39 +0200 <abastro[m]> More Buildings!!!
2022-04-21 03:37:47 +0200abastro[m]sigh
2022-04-21 03:37:54 +0200Me-me(~me-me@tunnel690570-pt.tunnel.tserv12.mia1.ipv6.he.net) (Changing host)
2022-04-21 03:37:54 +0200Me-me(~me-me@user/me-me)
2022-04-21 03:38:16 +0200 <abastro[m]> Once heard 40~50% of uni budget goes into buildings
2022-04-21 03:39:33 +0200[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470)
2022-04-21 03:43:18 +0200littlebobeep(~alMalsamo@gateway/tor-sasl/almalsamo)
2022-04-21 03:45:46 +0200ralu1(~ralu@static.211.245.203.116.clients.your-server.de)
2022-04-21 03:45:56 +0200vicfred(~vicfred@user/vicfred) (Quit: Leaving)
2022-04-21 03:51:25 +0200TonyStone(~TonyStone@cpe-74-76-51-197.nycap.res.rr.com) (Remote host closed the connection)
2022-04-21 03:54:51 +0200eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
2022-04-21 03:56:25 +0200TonyStone(~TonyStone@2603-7080-8607-c36a-e10b-aeba-a8b3-e9aa.res6.spectrum.com)
2022-04-21 03:57:39 +0200abastro(~abab9579@220.75.216.63)
2022-04-21 03:59:01 +0200eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 246 seconds)
2022-04-21 03:59:21 +0200oxide(~lambda@user/oxide) (Ping timeout: 276 seconds)
2022-04-21 04:00:35 +0200ec(~ec@gateway/tor-sasl/ec) (Ping timeout: 240 seconds)
2022-04-21 04:01:01 +0200oxide(~lambda@user/oxide)
2022-04-21 04:01:36 +0200waleee(~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) (Ping timeout: 260 seconds)
2022-04-21 04:01:52 +0200EvanR(~EvanR@user/evanr) (Quit: Leaving)
2022-04-21 04:03:48 +0200eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
2022-04-21 04:06:23 +0200Guest91(~Guest91@caliga.eecs.tufts.edu) (Quit: Client closed)
2022-04-21 04:12:35 +0200 <janus> abastro[m]: doesn't seem like that is true for iowa: https://fmb.fo.uiowa.edu/university-wide-budgeted-expenditures-fy2020
2022-04-21 04:12:47 +0200earthy(~arthurvl@2001:984:275b:1:ba27:ebff:fea0:40b0) (Ping timeout: 260 seconds)
2022-04-21 04:13:10 +0200[Leary](~Leary]@122-58-90-96-vdsl.sparkbb.co.nz)
2022-04-21 04:13:21 +0200 <janus> BLDG RENEWAL is part of the red 2.5% at the bottom
2022-04-21 04:13:21 +0200 <abastro> Oh, TIL that was regional one.
2022-04-21 04:13:38 +0200 <abastro> Interesting that how salaries are of huge portion there
2022-04-21 04:14:03 +0200 <abastro> Perhaps higher salary standard affecting?
2022-04-21 04:14:11 +0200JordiGH(~jordi@user/jordigh) (Ping timeout: 260 seconds)
2022-04-21 04:17:30 +0200oxide(~lambda@user/oxide) (Quit: oxide)
2022-04-21 04:17:54 +0200oxide(~lambda@user/oxide)
2022-04-21 04:18:12 +0200jinsun__(~jinsun@user/jinsun) (Ping timeout: 276 seconds)
2022-04-21 04:18:47 +0200frost(~frost@user/frost)
2022-04-21 04:18:59 +0200aman_(~aman@user/aman)
2022-04-21 04:20:10 +0200JordiGH(~jordi@user/jordigh)
2022-04-21 04:22:12 +0200bitdex(~bitdex@gateway/tor-sasl/bitdex)
2022-04-21 04:25:17 +0200 <Axman6> Universities literally exist to emply people to do research, so it's no surprise their major expenditure is salaries
2022-04-21 04:25:36 +0200FinnElija(~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
2022-04-21 04:25:36 +0200finn_elija(~finn_elij@user/finn-elija/x-0085643)
2022-04-21 04:25:36 +0200finn_elijaFinnElija
2022-04-21 04:26:20 +0200lifter(~lifter@2600:1702:37d0:4310:10d9:2213:a793:979a)
2022-04-21 04:26:22 +0200earthy(~arthurvl@2a02-a469-f5e2-1-ba27-ebff-fea0-40b0.fixed6.kpn.net)
2022-04-21 04:28:35 +0200 <lifter> Am I correct that there really isn't a practical application of the "fix" function given that there is nothing you can do with "fix" that you cannot accomplish by some other, more idiomatic means?
2022-04-21 04:28:38 +0200Hash(~Hash@hey.howstoned.ru) (Read error: Connection reset by peer)
2022-04-21 04:30:18 +0200Hash(~Hash@hey.howstoned.ru)
2022-04-21 04:30:48 +0200 <Axman6> it's just a convenience function, it's Haskell equivalent of the Y-combinator
2022-04-21 04:31:23 +0200 <Axman6> sometimes you don't want to name a function to make a recursive function, and that's exactly what fix allows you to do
2022-04-21 04:31:51 +0200 <lifter> Ah OK I can see that I think.
2022-04-21 04:31:51 +0200 <Axman6> let f x = ... f ... === fix (\f x -> ...f ...)
2022-04-21 04:33:12 +0200 <lifter> Well you've still named your recursive function "f", right?
2022-04-21 04:33:46 +0200 <Axman6> only within the lambda - f is not a name that is useable by any other code
2022-04-21 04:34:33 +0200 <dolio> > fix ?? 5 $ \fac n -> if n == 0 then 1 else n * fac (n-1)
2022-04-21 04:34:35 +0200 <lambdabot> 120
2022-04-21 04:35:08 +0200 <Axman6> > fix ('a':) -- recursion without having to use any names at all
2022-04-21 04:35:10 +0200 <lambdabot> "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
2022-04-21 04:35:22 +0200tcard(~tcard@p2878075-ipngn18701hodogaya.kanagawa.ocn.ne.jp) (Quit: Leaving)
2022-04-21 04:35:28 +0200 <lifter> I'm aware of those examples. Just searching for a practical application.3
2022-04-21 04:35:51 +0200 <dolio> That is a practical example.
2022-04-21 04:35:56 +0200Sgeo_(~Sgeo@user/sgeo)
2022-04-21 04:36:01 +0200 <dolio> They define macros in Scheme for that.
2022-04-21 04:36:26 +0200 <Axman6> but like many functions in the prelude, fix is just a convenience for those times when it makes sense to use, just like flip, const, ap, id (hmmm, I wonder of those are turing complete...)
2022-04-21 04:36:37 +0200 <lifter> I mean you could just do `['a','a'..]`
2022-04-21 04:36:40 +0200JordiGH(~jordi@user/jordigh) (Ping timeout: 248 seconds)
2022-04-21 04:36:46 +0200 <dibblego> why use map f instead of foldr ((:) . f) []? Just searching for a practical application of map
2022-04-21 04:36:56 +0200 <Axman6> that actually produces a different value in memory
2022-04-21 04:36:57 +0200 <zzz> dolio: what's the `??` ?
2022-04-21 04:37:06 +0200 <dolio> It's infix flip.
2022-04-21 04:37:30 +0200 <Axman6> the fix version is a self recursive list, whereas the ['a','a'..] version will build up a larger and larger list as more of it is avaluated
2022-04-21 04:37:55 +0200oxide(~lambda@user/oxide) (Quit: oxide)
2022-04-21 04:38:14 +0200 <Axman6> so, while those values are Eq equivalent, they do actually behave differently
2022-04-21 04:38:43 +0200 <lifter> Hmm I don't quite understand the distinctino.
2022-04-21 04:38:45 +0200 <Axman6> > let as = 'a':as in as -- the tail of the list literally points to itself
2022-04-21 04:38:46 +0200 <lambdabot> "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...
2022-04-21 04:38:52 +0200oxide(~lambda@user/oxide)
2022-04-21 04:39:00 +0200Sgeo(~Sgeo@user/sgeo) (Ping timeout: 276 seconds)
2022-04-21 04:39:26 +0200 <Axman6> in ['a','a'..], each cons cell is distinct, they are not the same location in memory
2022-04-21 04:39:47 +0200 <lifter> Well OK I can see that what's happening under the hood is different. Wow that's pretty wild.
2022-04-21 04:40:09 +0200 <Axman6> @src repeat
2022-04-21 04:40:09 +0200 <lambdabot> repeat x = xs where xs = x : xs
2022-04-21 04:40:29 +0200 <Axman6> if you had used repeat the result is identical to the fix version
2022-04-21 04:40:39 +0200 <Axman6> repeat x = fix (x:)
2022-04-21 04:41:00 +0200 <lifter> OK that's interesting.
2022-04-21 04:41:49 +0200 <Axman6> if you think about it in terms of C, it's like having a linked list struct which points to itself
2022-04-21 04:43:45 +0200 <Sgeo_> Is there a name for the concept that s -> a is the same as (a->r)->s->r? Something with continuations or continuation passing style?
2022-04-21 04:44:28 +0200 <dolio> The Yoneda lemma.
2022-04-21 04:44:49 +0200 <Axman6> yoneda a bigger lemma
2022-04-21 04:45:31 +0200eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
2022-04-21 04:46:01 +0200 <Sgeo_> Thank you
2022-04-21 04:46:50 +0200oxide(~lambda@user/oxide) (Quit: oxide)
2022-04-21 04:47:10 +0200oxide(~lambda@user/oxide)
2022-04-21 04:48:02 +0200oxide(~lambda@user/oxide) (Client Quit)
2022-04-21 04:48:47 +0200oxide(~lambda@user/oxide)
2022-04-21 04:50:03 +0200oxide(~lambda@user/oxide) (Client Quit)
2022-04-21 04:50:32 +0200oxide(~lambda@user/oxide)
2022-04-21 04:51:06 +0200aman_aman
2022-04-21 04:56:54 +0200oxide(~lambda@user/oxide) (Quit: oxide)
2022-04-21 04:57:40 +0200 <jackdk> I use `fix` often in monadic code like `fix $ \loop -> do ...`, in things like socket handlers
2022-04-21 05:01:40 +0200oxide(~lambda@user/oxide)
2022-04-21 05:02:11 +0200JordiGH(~jordi@user/jordigh)
2022-04-21 05:05:03 +0200oxide(~lambda@user/oxide) (Client Quit)
2022-04-21 05:05:29 +0200oxide(~lambda@user/oxide)
2022-04-21 05:08:35 +0200 <lifter> jackdk: Yeah that's a neat example, thanks!
2022-04-21 05:09:43 +0200 <jackdk> lifter: yw. I sometimes find it nicer than the combinators in `monad-loops`, as you let control fall out the bottom of the function when you're done
2022-04-21 05:23:56 +0200 <Axman6> I wonder how hard it would be to write something which gives you the same semantics for looping as continue, break etc. in other languages; loop \continue break -> do ... when done break; when shouldSkip continue; ...
2022-04-21 05:24:13 +0200 <Axman6> feels doable using Cont(T)
2022-04-21 05:26:09 +0200 <Axman6> https://hackage.haskell.org/package/loops-0.2.0.2/docs/Control-Monad-Loop.html
2022-04-21 05:27:27 +0200JordiGH(~jordi@user/jordigh) (Ping timeout: 260 seconds)
2022-04-21 05:27:52 +0200pavonia(~user@user/siracusa) (Quit: Bye!)
2022-04-21 05:30:46 +0200eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
2022-04-21 05:31:44 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net)
2022-04-21 05:32:38 +0200cesar-(~cesar@2600:1700:9490:79f0::f) (Ping timeout: 250 seconds)
2022-04-21 05:33:30 +0200tcard(~tcard@p2878075-ipngn18701hodogaya.kanagawa.ocn.ne.jp)
2022-04-21 05:35:58 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net) (Ping timeout: 246 seconds)
2022-04-21 05:50:05 +0200wyrd(~wyrd@gateway/tor-sasl/wyrd) (Quit: leaving)
2022-04-21 05:58:29 +0200oxide(~lambda@user/oxide) (Quit: oxide)
2022-04-21 05:58:56 +0200oxide(~lambda@user/oxide)
2022-04-21 06:00:50 +0200CodeKiwiDigitalKiwi
2022-04-21 06:01:01 +0200 <albet70> how you pronounce >=>?
2022-04-21 06:01:13 +0200 <dolio> That's a fish.
2022-04-21 06:01:20 +0200 <dibblego> "are you gonna go my way?"
2022-04-21 06:02:12 +0200 <albet70> so f >=> g is f fish g?
2022-04-21 06:02:42 +0200 <dibblego> are you, f, gonna go my, g, way?
2022-04-21 06:02:57 +0200[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470) (Read error: Connection reset by peer)
2022-04-21 06:04:10 +0200oxide(~lambda@user/oxide) (Quit: oxide)
2022-04-21 06:04:33 +0200oxide(~lambda@user/oxide)
2022-04-21 06:08:19 +0200abastro(~abab9579@220.75.216.63) (Ping timeout: 240 seconds)
2022-04-21 06:08:57 +0200 <albet70> >=> is Kleisli arrow?
2022-04-21 06:09:05 +0200 <dibblego> kleisli composition
2022-04-21 06:12:01 +0200 <albet70> which scenario would use Kleisli composition? I barely used it ever
2022-04-21 06:12:38 +0200 <dibblego> every time you need a function of type Monad m => (a -> m b) -> (b -> m c) -> a -> m
2022-04-21 06:13:51 +0200 <albet70> fish = \g, f -> \x, y -> f (g x y) y
2022-04-21 06:14:55 +0200 <dibblego> fish f g = \a -> f a >>= g
2022-04-21 06:15:41 +0200 <albet70> without (), it's easy to misunderstand
2022-04-21 06:16:35 +0200 <albet70> \a->(f a >>= g) or (\a -> f a) >>= g
2022-04-21 06:16:55 +0200 <dibblego> fish f g = (\a -> ((f a) >>= g))
2022-04-21 06:16:58 +0200 <zzz> albet70: one of the most.familiar cases might be the composition of functions of the type a -> Either b a
2022-04-21 06:22:01 +0200cdman(~dcm@27.2.217.159)
2022-04-21 06:22:01 +0200cdman(~dcm@27.2.217.159) (Changing host)
2022-04-21 06:22:01 +0200cdman(~dcm@user/dmc/x-4369397)
2022-04-21 06:23:07 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net)
2022-04-21 06:25:58 +0200lifter(~lifter@2600:1702:37d0:4310:10d9:2213:a793:979a) ()
2022-04-21 06:30:27 +0200deadmarshal_(~deadmarsh@95.38.229.55)
2022-04-21 06:31:13 +0200pilyn(~pilyn@user/pilyn)
2022-04-21 06:42:44 +0200jerry99(~339ea102@cerf.good1.com) (Quit: CGI:IRC (EOF))
2022-04-21 06:43:12 +0200pilyn(~pilyn@user/pilyn) (Remote host closed the connection)
2022-04-21 06:43:50 +0200pilyn(~pilyn@user/pilyn)
2022-04-21 06:45:56 +0200vysn(~vysn@user/vysn)
2022-04-21 06:47:17 +0200bahamas(~lucian@84.232.140.158)
2022-04-21 06:51:15 +0200EvanR(~EvanR@user/evanr)
2022-04-21 06:55:39 +0200renzhi(~xp@2607:fa49:6500:b100::229c) (Ping timeout: 240 seconds)
2022-04-21 06:57:32 +0200img(~img@user/img) (Quit: ZNC 1.8.2 - https://znc.in)
2022-04-21 06:58:57 +0200img(~img@user/img)
2022-04-21 07:03:07 +0200 <zzz> is there any reason why we have to surround operators in parens when asking ghci for their type?
2022-04-21 07:04:15 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net) (Remote host closed the connection)
2022-04-21 07:04:22 +0200 <zzz> @type $
2022-04-21 07:04:23 +0200 <lambdabot> error:
2022-04-21 07:04:23 +0200 <lambdabot> parse error on input ‘$’
2022-04-21 07:04:23 +0200 <lambdabot> Perhaps you intended to use TemplateHaskell
2022-04-21 07:05:28 +0200son0p(~ff@181.136.122.143) (Ping timeout: 248 seconds)
2022-04-21 07:05:46 +0200 <zzz> :info $ works just fine
2022-04-21 07:06:22 +0200 <zzz> i guess :type demands an expression
2022-04-21 07:06:53 +0200pilyn(~pilyn@user/pilyn) (Quit: Leaving)
2022-04-21 07:09:04 +0200wroathe(~wroathe@user/wroathe) (Ping timeout: 246 seconds)
2022-04-21 07:09:16 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net)
2022-04-21 07:13:23 +0200 <abastro[m]> :t $
2022-04-21 07:13:25 +0200 <lambdabot> error:
2022-04-21 07:13:25 +0200 <lambdabot> parse error on input ‘$’
2022-04-21 07:13:25 +0200 <lambdabot> Perhaps you intended to use TemplateHaskell
2022-04-21 07:13:27 +0200earthy(~arthurvl@2a02-a469-f5e2-1-ba27-ebff-fea0-40b0.fixed6.kpn.net) (Ping timeout: 240 seconds)
2022-04-21 07:13:29 +0200 <abastro[m]> Oh
2022-04-21 07:14:20 +0200 <jackdk> zzz: I think asking `:t` for the type of anything but an expression is an ill-posed question
2022-04-21 07:14:24 +0200earthy(~arthurvl@2a02-a469-f5e2-1-ba27-ebff-fea0-40b0.fixed6.kpn.net)
2022-04-21 07:14:39 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net) (Ping timeout: 256 seconds)
2022-04-21 07:14:50 +0200 <dsal> :t ($)
2022-04-21 07:14:51 +0200 <lambdabot> (a -> b) -> a -> b
2022-04-21 07:15:04 +0200 <jackdk> % :info id
2022-04-21 07:15:05 +0200 <yahb> jackdk: id :: a -> a -- Defined in `GHC.Base'
2022-04-21 07:15:14 +0200 <jackdk> % :info $
2022-04-21 07:15:15 +0200 <yahb> jackdk: ($) :: (a -> b) -> a -> b -- Defined in `GHC.Base'; infixr 0 $
2022-04-21 07:15:27 +0200 <jackdk> % infixr 0 id
2022-04-21 07:15:27 +0200 <yahb> jackdk: ; <interactive>:124:10: error: parse error on input `id'
2022-04-21 07:15:34 +0200 <jackdk> % infixr 0 `id`
2022-04-21 07:15:35 +0200 <yahb> jackdk: ; <interactive>:125:10: error:; The fixity signature for `id' lacks an accompanying binding; (The fixity signature must be given where `id' is declared)
2022-04-21 07:15:39 +0200 <jackdk> darn
2022-04-21 07:16:59 +0200jbarot(~jbarot@180.190.247.113)
2022-04-21 07:17:47 +0200jbarotpawikan_
2022-04-21 07:18:00 +0200 <pawikan_> Hi. I'm learning haskell.
2022-04-21 07:18:36 +0200redb(~nmh@136.49.49.211) (Ping timeout: 240 seconds)
2022-04-21 07:18:46 +0200 <dragestil> Are there any modern successors of haskell-indexer or haskell-code-explorer? both seem unmaintained now. And haskell-language-server does not support cross-library find-definition either.
2022-04-21 07:19:24 +0200Neon(~Neon@2001:18c0:aa0:8200:cd5c:6a4f:dbd9:2404)
2022-04-21 07:19:48 +0200pawikan_(~jbarot@180.190.247.113) (Client Quit)
2022-04-21 07:24:39 +0200redb(~nmh@136.49.49.211)
2022-04-21 07:25:39 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net)
2022-04-21 07:29:23 +0200redb(~nmh@136.49.49.211) (Ping timeout: 256 seconds)
2022-04-21 07:32:29 +0200takuan(~takuan@178-116-218-225.access.telenet.be)
2022-04-21 07:33:55 +0200deadmarshal_(~deadmarsh@95.38.229.55) (Ping timeout: 256 seconds)
2022-04-21 07:35:18 +0200aman(~aman@user/aman) (Remote host closed the connection)
2022-04-21 07:35:58 +0200aman(~aman@user/aman)
2022-04-21 07:37:49 +0200xkuru(~xkuru@user/xkuru)
2022-04-21 07:39:53 +0200jakalx(~jakalx@base.jakalx.net) (Disconnected: Replaced by new connection)
2022-04-21 07:39:54 +0200jakalx(~jakalx@base.jakalx.net)
2022-04-21 07:53:22 +0200Midjak(~Midjak@82.66.147.146)
2022-04-21 07:54:53 +0200bahamas(~lucian@84.232.140.158) (Ping timeout: 256 seconds)
2022-04-21 07:54:59 +0200inversed(~inversed@94.13.111.159) (Read error: Connection reset by peer)
2022-04-21 07:55:06 +0200michalz(~michalz@185.246.204.43)
2022-04-21 07:57:46 +0200zmt01(~zmt00@user/zmt00) (Quit: Leaving)
2022-04-21 07:57:50 +0200redb(~nmh@136.49.49.211)
2022-04-21 07:58:01 +0200 <maerwald[m]> dragestil: there's a trick to allor cross-library find definition
2022-04-21 07:58:19 +0200 <maerwald[m]> You "vendor" all dependencies (add them as packages in cabal.project)
2022-04-21 07:58:31 +0200 <maerwald[m]> Local packages work in HLS
2022-04-21 07:59:52 +0200 <maerwald[m]> https://cabal.readthedocs.io/en/stable/cabal-project.html?highlight=optional-packages#cfg-field-op…
2022-04-21 08:00:13 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net) (Remote host closed the connection)
2022-04-21 08:00:20 +0200zmt00(~zmt00@user/zmt00)
2022-04-21 08:01:13 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net)
2022-04-21 08:01:33 +0200 <dragestil> maerwald[m]: ok, but can I point to hls packages already in the local filesystem this way?
2022-04-21 08:02:15 +0200redb(~nmh@136.49.49.211) (Ping timeout: 256 seconds)
2022-04-21 08:02:29 +0200 <dragestil> or do I have to get an extra copy of the package I want to find definitions through cabal?
2022-04-21 08:03:08 +0200redb(~nmh@136.49.49.211)
2022-04-21 08:03:59 +0200 <dragestil> say I have two projects A and B, both depending on module C. Will I have to download C twice, if I want to find definitions in both projects, of symbols defined in C?
2022-04-21 08:05:39 +0200jao(~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net) (Ping timeout: 240 seconds)
2022-04-21 08:05:53 +0200gpncarl(~gpncarl@222.249.231.3)
2022-04-21 08:06:13 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net) (Ping timeout: 256 seconds)
2022-04-21 08:07:19 +0200redb(~nmh@136.49.49.211) (Ping timeout: 240 seconds)
2022-04-21 08:08:05 +0200pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
2022-04-21 08:08:35 +0200gpncarl(~gpncarl@222.249.231.3) (Quit: WeeChat 3.4.1)
2022-04-21 08:14:41 +0200redb(~nmh@136.49.49.211)
2022-04-21 08:17:39 +0200slac71531(~slack1256@191.125.99.203) (Ping timeout: 240 seconds)
2022-04-21 08:19:04 +0200redb(~nmh@136.49.49.211) (Ping timeout: 246 seconds)
2022-04-21 08:19:36 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net)
2022-04-21 08:20:08 +0200 <albet70> % :t (>=>) @[]
2022-04-21 08:20:08 +0200 <yahb> albet70: (a -> [b]) -> (b -> [c]) -> a -> [c]
2022-04-21 08:21:53 +0200 <albet70> >=> = \g, f -> \a -> join (f <$> (g a))?
2022-04-21 08:22:39 +0200hololeap(~hololeap@user/hololeap)
2022-04-21 08:22:57 +0200 <albet70> f :: b -> [c], but g a:: [b]
2022-04-21 08:23:30 +0200deadmarshal_(~deadmarsh@95.38.229.55)
2022-04-21 08:23:48 +0200 <albet70> so fmap f (g a) would get [[c]]
2022-04-21 08:23:55 +0200 <albet70> is that right?
2022-04-21 08:24:50 +0200pagnol(~user@014198154145.ctinets.com)
2022-04-21 08:25:27 +0200tzh(~tzh@c-24-21-73-154.hsd1.wa.comcast.net) (Remote host closed the connection)
2022-04-21 08:25:52 +0200coot(~coot@213.134.190.95)
2022-04-21 08:27:20 +0200 <hololeap> your syntax is a little weird, but you're essentially correct
2022-04-21 08:27:39 +0200acidjnk(~acidjnk@p200300d0c722df6114cdc3ce0552b93f.dip0.t-ipconnect.de)
2022-04-21 08:27:57 +0200 <albet70> what's your syntax?
2022-04-21 08:28:37 +0200 <dragestil> OK, reading the docs I added optional package pointing to a local ghc repo in a project, restarting the language server it still cannot find reference to some symbols defined in ghc
2022-04-21 08:28:37 +0200 <hololeap> I was referring to this: >=> = \g, f -> \a -> join (f <$> (g a))?
2022-04-21 08:28:47 +0200dyeplexer(~dyeplexer@user/dyeplexer)
2022-04-21 08:29:53 +0200 <albet70> >=> = \g, f-> \a -> (g a) >>= f?
2022-04-21 08:30:40 +0200 <hololeap> (>=>) = \f g -> join . fmap g . f
2022-04-21 08:31:00 +0200redb(~nmh@136.49.49.211)
2022-04-21 08:31:01 +0200 <hololeap> or, f >=> g = join . fmap g . f
2022-04-21 08:31:20 +0200Ram-Z(Ram-Z@2a01:7e01::f03c:91ff:fe57:d2df) (Ping timeout: 260 seconds)
2022-04-21 08:32:04 +0200abastro(~abab9579@220.75.216.63)
2022-04-21 08:32:31 +0200 <hololeap> or this, which is what I think you were going for: (>=>) = \f g -> \a -> join (g <$> f a)
2022-04-21 08:32:56 +0200 <hololeap> it was really just the comma that made it "weird"
2022-04-21 08:33:34 +0200 <hololeap> and also if you define an infix function like that, you need to wrap it in parens
2022-04-21 08:34:17 +0200geekosaur(~geekosaur@xmonad/geekosaur) (Remote host closed the connection)
2022-04-21 08:34:41 +0200geekosaur(~geekosaur@xmonad/geekosaur)
2022-04-21 08:34:58 +0200jbarot(~jbarot@180.190.247.113)
2022-04-21 08:35:07 +0200jbarotpawikan_
2022-04-21 08:35:10 +0200 <pawikan_> hello everyone
2022-04-21 08:35:36 +0200redb(~nmh@136.49.49.211) (Ping timeout: 276 seconds)
2022-04-21 08:35:49 +0200 <hololeap> yo
2022-04-21 08:35:58 +0200 <pawikan_> how long are you using haskell?
2022-04-21 08:36:25 +0200 <hololeap> I dunno, I think I first tried it out around 2016 or so
2022-04-21 08:36:27 +0200mikoto-chan(~mikoto-ch@213.177.151.239)
2022-04-21 08:37:07 +0200 <pagnol> I've returned to writing some Haskell after a long break and what I'm struggling to get used to is the absence of 'proper' records
2022-04-21 08:37:22 +0200 <pawikan_> Good for you @hololeap
2022-04-21 08:37:26 +0200Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer)
2022-04-21 08:37:34 +0200 <pawikan_> I'm just starting learning haskell.
2022-04-21 08:37:45 +0200 <albet70> "hololeap :it was really just the comma that made it "weird"", is that , in lambda is available?
2022-04-21 08:37:54 +0200Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi)
2022-04-21 08:38:02 +0200 <albet70> \f g and \f, g
2022-04-21 08:38:03 +0200mikoto-chan(~mikoto-ch@213.177.151.239) (Read error: Connection reset by peer)
2022-04-21 08:38:12 +0200Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer)
2022-04-21 08:38:23 +0200 <hololeap> no, you can't put a comma in a lambda like that
2022-04-21 08:38:32 +0200 <albet70> some languages use , to split parameter in lambda
2022-04-21 08:38:43 +0200 <albet70> "hololeap :no, you can't put a comma in a lambda like that", ok
2022-04-21 08:39:39 +0200 <hololeap> the only place commas are used are structures with separated values, like tuples and lists
2022-04-21 08:39:56 +0200 <hololeap> that might not be 100% true, but more or less is
2022-04-21 08:40:01 +0200 <albet70> why some people use \f g and some using \g f, is there a rule?
2022-04-21 08:40:30 +0200 <hololeap> no, not really a rule, just convention, but it's mostly preference
2022-04-21 08:41:35 +0200 <albet70> about fmap on list, use recursive to define and use list compression to define, are ok?
2022-04-21 08:41:49 +0200 <albet70> list comprehension
2022-04-21 08:42:37 +0200 <hololeap> define fmap on a list? like as an exercise?
2022-04-21 08:42:46 +0200 <albet70> use iteration, not recursion
2022-04-21 08:42:58 +0200 <hololeap> fmap's already defined for lists
2022-04-21 08:43:41 +0200 <albet70> fmap f xs = [ f x |x <- xs ]
2022-04-21 08:43:47 +0200mikoto-chan(~mikoto-ch@213.177.151.239)
2022-04-21 08:43:53 +0200 <hololeap> all you need to do is walk the list and convert each value using the given function, so recursion is fine for that
2022-04-21 08:44:28 +0200 <hololeap> defining fmap for lists using list comprehensions seems silly, since list comprehensions rely on fmap being defined for lists :p
2022-04-21 08:44:30 +0200 <albet70> "hololeap :all you need to do is walk the list and convert each value using the given function, so recursion is fine for that", but what if there is no tail call optimization
2022-04-21 08:44:52 +0200 <hololeap> ghc figures that out for you
2022-04-21 08:45:54 +0200mikoto-chan(~mikoto-ch@213.177.151.239) (Read error: Connection reset by peer)
2022-04-21 08:46:21 +0200 <zzz> list comprehensions are silly. fight me
2022-04-21 08:47:41 +0200 <hololeap> you might have to add some eager evaluation in there to prevent a buildup of thunks on long lists, but other than that, ghc should figure it out for you
2022-04-21 08:50:11 +0200 <zzz> id = \x -> [ a | a <- x ]
2022-04-21 08:51:40 +0200 <Axman6> pawikan_: is there anything we can help you with? Please feel free to ask
2022-04-21 08:52:06 +0200mikoto-chan(~mikoto-ch@213.177.151.239)
2022-04-21 08:53:03 +0200xkuru(~xkuru@user/xkuru) (Read error: Connection reset by peer)
2022-04-21 08:57:22 +0200dhouthoo(~dhouthoo@178-117-36-167.access.telenet.be)
2022-04-21 08:59:42 +0200phma(~phma@2001:5b0:2143:fb58:37e7:bba5:12de:8897) (Read error: Connection reset by peer)
2022-04-21 09:00:27 +0200phma(~phma@host-67-44-209-28.hnremote.net)
2022-04-21 09:03:24 +0200inversed(~inversed@94.13.111.159)
2022-04-21 09:03:41 +0200redb(~nmh@136.49.49.211)
2022-04-21 09:08:25 +0200redb(~nmh@136.49.49.211) (Ping timeout: 246 seconds)
2022-04-21 09:09:50 +0200 <abastro> I also think list comprehension is silly
2022-04-21 09:10:37 +0200tromp(~textual@dhcp-077-249-230-040.chello.nl)
2022-04-21 09:12:01 +0200 <albet70> using list comprehension can express prime in one line
2022-04-21 09:13:54 +0200shriekingnoise(~shrieking@201.231.16.156) (Quit: Quit)
2022-04-21 09:14:54 +0200 <albet70> > p = s [2..] where s (x : xs) = s [i <- xs, mod i x /= 0]
2022-04-21 09:14:56 +0200 <lambdabot> <hint>:1:3: error: parse error on input ‘=’
2022-04-21 09:15:17 +0200 <albet70> > s [2..] where s (x : xs) = s [i <- xs, mod i x /= 0]
2022-04-21 09:15:19 +0200 <lambdabot> <hint>:1:9: error: parse error on input ‘where’
2022-04-21 09:17:13 +0200 <tomsmeding> > let p = s [2..] where s (x : xs) = s [i <- xs, mod i x /= 0] in p
2022-04-21 09:17:15 +0200 <lambdabot> <hint>:1:41: error:
2022-04-21 09:17:15 +0200 <lambdabot> parse error on input ‘<-’
2022-04-21 09:17:15 +0200 <lambdabot> Perhaps this statement should be within a 'do' block?
2022-04-21 09:17:25 +0200 <tomsmeding> > let p = s [2..] where s (x : xs) = s [i | i <- xs, mod i x /= 0] in p
2022-04-21 09:17:31 +0200 <lambdabot> mueval-core: Time limit exceeded
2022-04-21 09:17:40 +0200 <tomsmeding> ¯\_(ツ)_/¯
2022-04-21 09:17:55 +0200fendor(~fendor@178.115.48.2.wireless.dyn.drei.com)
2022-04-21 09:18:56 +0200son0p(~ff@181.136.122.143)
2022-04-21 09:18:58 +0200 <janus> @src catMaybes
2022-04-21 09:18:58 +0200 <lambdabot> catMaybes ls = [x | Just x <- ls]
2022-04-21 09:19:39 +0200redb(~nmh@136.49.49.211)
2022-04-21 09:19:39 +0200 <janus> zzz: how would you prefer to express catMaybes? with do-notation?
2022-04-21 09:19:50 +0200Neon(~Neon@2001:18c0:aa0:8200:cd5c:6a4f:dbd9:2404) (Quit: Leaving)
2022-04-21 09:20:09 +0200Major_Biscuit(~MajorBisc@c-001-009-046.client.tudelft.eduvpn.nl)
2022-04-21 09:20:50 +0200 <tomsmeding> base defines catMaybes using 'mapMaybe id', and mapMaybe using recursion
2022-04-21 09:21:44 +0200 <janus> but it is unclear what base optimizes for, i don't think it is readability ;)
2022-04-21 09:21:49 +0200 <tomsmeding> indeed :p
2022-04-21 09:21:51 +0200Pickchea(~private@user/pickchea)
2022-04-21 09:22:23 +0200zeenk(~zeenk@2a02:2f04:a313:d600:8d26:ec9f:3ff6:fc94)
2022-04-21 09:24:04 +0200jinsun(~jinsun@user/jinsun)
2022-04-21 09:24:21 +0200redb(~nmh@136.49.49.211) (Ping timeout: 276 seconds)
2022-04-21 09:24:57 +0200chele(~chele@user/chele)
2022-04-21 09:27:22 +0200gurkenglas(~gurkengla@dslb-178-012-018-212.178.012.pools.vodafone-ip.de)
2022-04-21 09:29:34 +0200 <abastro> Hm, isn't it that hard with do notation?
2022-04-21 09:30:06 +0200 <abastro> I mean
2022-04-21 09:30:21 +0200 <abastro> Is primes that hard to achieve with do notation
2022-04-21 09:30:30 +0200lortabac(~lortabac@2a01:e0a:541:b8f0:8b3f:8bd5:3852:70b0)
2022-04-21 09:30:41 +0200merijn(~merijn@c-001-001-001.client.esciencecenter.eduvpn.nl)
2022-04-21 09:30:44 +0200 <abastro> I dislike how there are two somewhat competing syntaxes for lists
2022-04-21 09:30:54 +0200gehmehgeh(~user@user/gehmehgeh)
2022-04-21 09:31:02 +0200pretty_d1(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
2022-04-21 09:31:45 +0200pretty_d1(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Client Quit)
2022-04-21 09:31:47 +0200pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Ping timeout: 256 seconds)
2022-04-21 09:33:52 +0200`2jt(~jtomas@175.red-83-36-129.dynamicip.rima-tde.net)
2022-04-21 09:35:20 +0200pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
2022-04-21 09:36:45 +0200pawikan_(~jbarot@180.190.247.113) (Quit: Leaving)
2022-04-21 09:38:56 +0200Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi)
2022-04-21 09:39:17 +0200 <tdammers> list comprehensions combine several common operations on lists into a single, compact syntax: cartesian product, filtering (including via pattern matching), and mapping.
2022-04-21 09:40:07 +0200 <tdammers> and they're not "competing syntaxes", really; you can write the same stuff in different ways, but each has different tradeoffs when it comes to readability and signalling intent
2022-04-21 09:40:47 +0200mikoto-chan(~mikoto-ch@213.177.151.239) (Read error: Connection reset by peer)
2022-04-21 09:43:46 +0200Ram-Z(~Ram-Z@li1814-254.members.linode.com)
2022-04-21 09:45:23 +0200mmhat(~mmh@55d4dd86.access.ecotel.net)
2022-04-21 09:45:34 +0200 <tomsmeding> abastro: https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/exts/monad_comprehensions.html#ext…
2022-04-21 09:46:23 +0200mikoto-chan(~mikoto-ch@213.177.151.239)
2022-04-21 09:48:35 +0200machinedgod(~machinedg@24.105.81.50)
2022-04-21 09:49:01 +0200zyklotomic(~ethan@res380d-128-61-86-145.res.gatech.edu) (Ping timeout: 246 seconds)
2022-04-21 09:50:17 +0200jgeerds(~jgeerds@d53604b0.access.ecotel.net)
2022-04-21 09:51:00 +0200Sgeo_(~Sgeo@user/sgeo) (Read error: Connection reset by peer)
2022-04-21 09:51:01 +0200redb(~nmh@136.49.49.211)
2022-04-21 09:51:03 +0200zyklotomic(~ethan@res380d-128-61-87-175.res.gatech.edu)
2022-04-21 09:54:23 +0200acidjnk(~acidjnk@p200300d0c722df6114cdc3ce0552b93f.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
2022-04-21 09:55:35 +0200redb(~nmh@136.49.49.211) (Ping timeout: 256 seconds)
2022-04-21 09:57:50 +0200 <abastro> Existence of monad comprehension is the proof of the competition ime
2022-04-21 09:58:37 +0200 <abastro> You could say it is not competing syntax, yeah, but then haskell got tons of syntax sugars which is hard to learn for beginners
2022-04-21 10:01:56 +0200bitdex(~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection)
2022-04-21 10:01:56 +0200 <tomsmeding> abastro: haskell has lots of places where there are multiple ways to do the same thing
2022-04-21 10:02:05 +0200CiaoSen(~Jura@p200300c95732ec002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
2022-04-21 10:02:21 +0200 <tomsmeding> function argument patterns / case expressions / pattern guards
2022-04-21 10:02:52 +0200 <tomsmeding> MultiParamTypeClasses + FunctionalDependencies / TypeFamilies
2022-04-21 10:02:58 +0200tromp(~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-04-21 10:04:09 +0200 <tomsmeding> [1..10] / enumFromTo 1 10
2022-04-21 10:04:16 +0200littlebobeep(~alMalsamo@gateway/tor-sasl/almalsamo) (Ping timeout: 240 seconds)
2022-04-21 10:04:22 +0200 <tomsmeding> maybe/either / pattern matching
2022-04-21 10:04:43 +0200hololeap(~hololeap@user/hololeap) (Excess Flood)
2022-04-21 10:04:46 +0200 <tomsmeding> f (g x) / f $ g x
2022-04-21 10:04:53 +0200 <tomsmeding> $ / &
2022-04-21 10:04:56 +0200 <tomsmeding> :')
2022-04-21 10:06:00 +0200bitdex(~bitdex@gateway/tor-sasl/bitdex)
2022-04-21 10:06:05 +0200 <zzz> janus: i don't have a specially favorite way, but there are no shortage of alternatives like `catMaybes = map fromJust . filter isJust`
2022-04-21 10:06:45 +0200littlebobeep(~alMalsamo@gateway/tor-sasl/almalsamo)
2022-04-21 10:10:14 +0200hololeap(~hololeap@user/hololeap)
2022-04-21 10:14:47 +0200anomal(~anomal@87.227.196.109)
2022-04-21 10:17:48 +0200 <abastro> Multiple ways to do the same thing, tbh I don't like some of that
2022-04-21 10:18:14 +0200 <abastro> Particularly because it is hard to say what is idiomatic.
2022-04-21 10:19:04 +0200 <abastro> FunDeps vs TypeFamilies are one problem I think. (Btw I recall using '&' was discouraged)
2022-04-21 10:20:30 +0200 <abastro> Eww pattern guards..
2022-04-21 10:20:57 +0200ccntrq(~Thunderbi@2a01:e34:eccb:b060:b69c:53df:cf2c:87d1)
2022-04-21 10:21:21 +0200 <zzz> some convenient sugar is good but in haskell there's a lot of bloat. if ... else ... then is completely unnecessary for example
2022-04-21 10:21:57 +0200 <abastro> Yep, that as well
2022-04-21 10:22:11 +0200 <zzz> pattern guards i like though
2022-04-21 10:22:27 +0200 <abastro> If blockarguments were a thing, `bool` can replace if-then-else
2022-04-21 10:22:45 +0200 <abastro> The problem with pattern guards as I see is how they add to the possible syntax
2022-04-21 10:23:24 +0200 <abastro> Actually yea, maybe pattern guards are not that problematic
2022-04-21 10:23:32 +0200 <abastro> ..hm
2022-04-21 10:23:41 +0200 <abastro> How is pattern guards distinct from viewpatterns?
2022-04-21 10:23:55 +0200redb(~nmh@136.49.49.211)
2022-04-21 10:24:00 +0200abastro(~abab9579@220.75.216.63) (Remote host closed the connection)
2022-04-21 10:24:32 +0200abastro(~abab9579@220.75.216.63)
2022-04-21 10:24:39 +0200 <merijn> Well, one requires an extension, one does not...
2022-04-21 10:25:14 +0200 <abastro> I mean ofc other than that
2022-04-21 10:25:14 +0200chenqisu1(~chenqisu1@183.217.200.38) (Quit: Leaving)
2022-04-21 10:25:15 +0200 <merijn> One is implicit function application voodoo, then other is explicit syntax
2022-04-21 10:26:21 +0200 <abastro> Implicit function application voodoo?
2022-04-21 10:26:56 +0200 <abastro> (I now think maybe pattern guard is fine? But then, it still adds to existing pile of syntax)
2022-04-21 10:26:58 +0200michalz(~michalz@185.246.204.43) (Read error: Connection reset by peer)
2022-04-21 10:28:44 +0200 <zzz> i use pattern guards instead of matching + testing if True/False, so in my approach i effectively reduce syntactic complexity
2022-04-21 10:30:58 +0200 <abastro> How do you achieve that?
2022-04-21 10:31:02 +0200 <abastro> Could you show an example?
2022-04-21 10:31:16 +0200 <[Leary]> Pattern guards are important when your scrutinee is of unknown type, e.g. casting from an existential into several possible types. Case-of would require a bunch of pointless nesting.
2022-04-21 10:31:29 +0200 <zzz> i will write https://paste.jrvieira.com/1650529874386
2022-04-21 10:31:51 +0200redb(~nmh@136.49.49.211) (Ping timeout: 256 seconds)
2022-04-21 10:33:03 +0200michalz(~michalz@185.246.204.58)
2022-04-21 10:35:34 +0200 <zzz> or *i would* write, in a perfect world where `if` was not a reserved word
2022-04-21 10:36:17 +0200 <merijn> zzz: eh...that's is a bad example, since it's needlessly complex :p
2022-04-21 10:36:38 +0200 <merijn> zzz: https://paste.tomsmeding.com/ziG9PMWq
2022-04-21 10:36:55 +0200 <abastro> There is also `bool t f p`
2022-04-21 10:37:46 +0200 <zzz> merijn: it's only needlessy complex because there is alternative syntax. my point is to reduce syntax
2022-04-21 10:37:51 +0200redb(~nmh@136.49.49.211)
2022-04-21 10:38:10 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net) (Remote host closed the connection)
2022-04-21 10:38:15 +0200 <zzz> i don't like that guards test for True/False
2022-04-21 10:38:30 +0200 <abastro> I mean, you could use `bool`
2022-04-21 10:38:38 +0200 <abastro> Or hypothetically, make `if` function
2022-04-21 10:38:44 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net)
2022-04-21 10:38:47 +0200tzh(~tzh@c-24-21-73-154.hsd1.or.comcast.net)
2022-04-21 10:38:59 +0200xff0x_(~xff0x@125x102x200x106.ap125.ftth.ucom.ne.jp) (Ping timeout: 240 seconds)
2022-04-21 10:39:01 +0200 <zzz> yes
2022-04-21 10:39:14 +0200 <zzz> but at some point we are just writing lisp
2022-04-21 10:39:37 +0200 <zzz> and noone wants that also :p
2022-04-21 10:42:17 +0200 <abastro> Could useBlockArguments
2022-04-21 10:42:28 +0200redb(~nmh@136.49.49.211) (Ping timeout: 250 seconds)
2022-04-21 10:43:37 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net) (Ping timeout: 246 seconds)
2022-04-21 10:44:11 +0200 <zzz> the hell with do notation!
2022-04-21 10:44:23 +0200 <abastro> https://paste.tomsmeding.com/I1gXsBMs
2022-04-21 10:44:25 +0200 <merijn> Hot take: BlockArguments is terrible extension
2022-04-21 10:44:54 +0200raehik(~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
2022-04-21 10:45:06 +0200 <abastro> Well I like how parens could be avoided with BlockArguments
2022-04-21 10:45:50 +0200 <zzz> merijn: i tend to agree. what makes it terrible in your opinion?
2022-04-21 10:46:22 +0200 <abastro> Perhaps if-then-else also encourages proliferation of "Bool", so it deserves to be lengthy
2022-04-21 10:46:46 +0200rembo10(~rembo10@main.remulis.com) (Quit: ZNC 1.8.2 - https://znc.in)
2022-04-21 10:47:32 +0200 <zzz> Bool should not benefit from special treatment
2022-04-21 10:47:40 +0200rembo10(~rembo10@main.remulis.com)
2022-04-21 10:47:52 +0200tzh(~tzh@c-24-21-73-154.hsd1.or.comcast.net) (Quit: zzz)
2022-04-21 10:47:53 +0200 <zzz> nor should lists
2022-04-21 10:48:01 +0200 <abastro> True
2022-04-21 10:48:12 +0200 <zzz> :)
2022-04-21 10:49:59 +0200infinity0(~infinity0@185.112.146.113) (Ping timeout: 240 seconds)
2022-04-21 10:52:46 +0200pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Quit: WeeChat 3.5)
2022-04-21 10:54:22 +0200tatsumaru(~tatsumaru@87.227.200.124)
2022-04-21 10:54:23 +0200chomwitt(~chomwitt@2a02:587:dc1b:da00:e2f9:e987:da5c:6097)
2022-04-21 10:57:19 +0200aman(~aman@user/aman) (Ping timeout: 240 seconds)
2022-04-21 10:57:44 +0200aman(~aman@user/aman)
2022-04-21 10:57:58 +0200Pickchea(~private@user/pickchea) (Ping timeout: 246 seconds)
2022-04-21 10:59:45 +0200tatsumaru(~tatsumaru@87.227.200.124) ()
2022-04-21 11:01:51 +0200ubert1(~Thunderbi@2a02:8109:9880:303c:8727:84d3:4f94:88b2)
2022-04-21 11:02:33 +0200byorgey(~byorgey@155.138.238.211) (Quit: leaving)
2022-04-21 11:06:12 +0200kuribas(~user@ip-188-118-57-242.reverse.destiny.be)
2022-04-21 11:07:05 +0200 <tdammers> I have all sorts of complaints about lisp, but "too many parenthesizes" is not one of htem
2022-04-21 11:10:17 +0200redb(~nmh@136.49.49.211)
2022-04-21 11:10:18 +0200deadmarshal_(~deadmarsh@95.38.229.55) (Ping timeout: 276 seconds)
2022-04-21 11:12:16 +0200DNH(~DNH@2a02:8109:b740:2c4:11d5:718e:c7c6:4a90)
2022-04-21 11:12:28 +0200 <kuribas> tdammers: +1
2022-04-21 11:12:42 +0200tromp(~textual@dhcp-077-249-230-040.chello.nl)
2022-04-21 11:14:27 +0200fef(~thedawn@user/thedawn)
2022-04-21 11:14:32 +0200redb(~nmh@136.49.49.211) (Ping timeout: 250 seconds)
2022-04-21 11:16:00 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net)
2022-04-21 11:17:05 +0200 <kuribas> lisps offer a great deal of flexibility, but it's easy for code to become only readable by the author.
2022-04-21 11:17:37 +0200 <kuribas> types reduce the expressivity, but make code more readable by other programmers.
2022-04-21 11:19:33 +0200 <abastro> I saw ppl finding typical Haskell code quite unreadable though
2022-04-21 11:21:22 +0200 <merijn> abastro: Sure, if you don't bother to learn the syntax
2022-04-21 11:25:23 +0200 <kuribas> abastro: you can make unreadable, complicated code in any language.
2022-04-21 11:25:44 +0200 <kuribas> IMO most unreadable haskell snippets use the (->) monad or functor.
2022-04-21 11:25:56 +0200 <kuribas> That or use unnecessary abstractions.
2022-04-21 11:26:21 +0200 <zzz> can you write unreadable code in APL?
2022-04-21 11:27:19 +0200__monty__(~toonn@user/toonn)
2022-04-21 11:27:20 +0200 <kuribas> "can you write readable code in APL" FTFY
2022-04-21 11:27:23 +0200abastro(~abab9579@220.75.216.63) (Ping timeout: 256 seconds)
2022-04-21 11:28:07 +0200 <zzz> prespective
2022-04-21 11:28:36 +0200 <merijn> kuribas: No :D
2022-04-21 11:31:17 +0200eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
2022-04-21 11:34:51 +0200 <kuribas> hmm, dynamic types are just dependent pairs...
2022-04-21 11:35:45 +0200 <kuribas> And partial functions over those pairs.
2022-04-21 11:37:49 +0200aman(~aman@user/aman) (Quit: aman)
2022-04-21 11:38:23 +0200aman(~aman@user/aman)
2022-04-21 11:39:13 +0200redb(~nmh@136.49.49.211)
2022-04-21 11:39:53 +0200 <lortabac> kuribas: 'Dynamic' in Haskell is a dependent pair, but I don't think it makes sense to generalize this specific representation to a universal definition of dynamic types
2022-04-21 11:42:16 +0200CiaoSen(~Jura@p200300c95732ec002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 248 seconds)
2022-04-21 11:42:22 +0200 <tdammers> when people say "unreadable", they usually mean "I am not familiar with this language and its idioms"
2022-04-21 11:44:57 +0200redb(~nmh@136.49.49.211) (Ping timeout: 256 seconds)
2022-04-21 11:46:35 +0200 <kuribas> tdammers: yeah, "(+) <$> [1, 2] <$> [3, 4]" would be weird to an outsider.
2022-04-21 11:46:56 +0200 <kuribas> erm "(+) <$> [1, 2] <*> [3, 4]"
2022-04-21 11:47:49 +0200 <kuribas> lortabac: dynamic types are most of the time implemented by a tag + value.
2022-04-21 11:48:02 +0200 <kuribas> lortabac: then they pattern match on the tag internally.
2022-04-21 11:48:10 +0200 <kuribas> lortabac: which is just a dependent pair.
2022-04-21 11:49:43 +0200 <kuribas> dyn : (t : Type ** t)
2022-04-21 11:49:46 +0200 <lortabac> kuribas: are you sure? To me "dependent" means that the dependency between the tag and the type is somehow formalized
2022-04-21 11:50:07 +0200 <lortabac> if it's all unsafe casts can we really call it dependent?
2022-04-21 11:50:18 +0200 <kuribas> lortabac: that's the partial part :)
2022-04-21 11:50:29 +0200 <kuribas> partial operations over dependent pairs.
2022-04-21 11:50:50 +0200 <lortabac> I see
2022-04-21 11:51:24 +0200 <lortabac> maybe we should say "morally dependent pairs" or something like that
2022-04-21 11:51:44 +0200 <lortabac> but now I see your point
2022-04-21 11:51:52 +0200oxide(~lambda@user/oxide) (Ping timeout: 246 seconds)
2022-04-21 11:52:00 +0200 <kuribas> lortabac: I am just thinking about how dynamic programmers claim types restrict you.
2022-04-21 11:52:25 +0200 <abastro[m]> tdammers: Well but ppl say e.g. Go is highly readable
2022-04-21 11:52:37 +0200 <kuribas> but you can implement dynamic in a static language using a dependent pair + unsafe cast.
2022-04-21 11:53:03 +0200 <lortabac> kuribas: to be honest I kind of agree with them on this point
2022-04-21 11:53:24 +0200 <__monty__> You don't even need those though? A simple ADT is also morally equivalent.
2022-04-21 11:54:15 +0200 <lortabac> some of the things that you would do in Clojure are hard to do in Haskell
2022-04-21 11:54:31 +0200zebrag(~chris@user/zebrag)
2022-04-21 11:54:39 +0200 <__monty__> And vice versa : )
2022-04-21 11:55:00 +0200oxide(~lambda@user/oxide)
2022-04-21 11:55:03 +0200 <tdammers> abastro[m]: so? Go looks very similar to languages people are already familiar with, so that's no surprise.
2022-04-21 11:55:08 +0200 <kuribas> lortabac: I really disagree.
2022-04-21 11:55:21 +0200 <kuribas> lortabac: They are easy to do in haskell, but we don't like the solution because it is partial.
2022-04-21 11:55:41 +0200 <kuribas> lortabac: or involves passing a Aeson Value everywhere.
2022-04-21 11:56:00 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net) (Remote host closed the connection)
2022-04-21 11:56:00 +0200 <abastro[m]> Indeed
2022-04-21 11:56:29 +0200 <kuribas> You could make a static language with an "Any" type, which will have an implicit unsafe cast wherever used.
2022-04-21 11:56:29 +0200 <abastro[m]> Also imperative style is similar to how ppl perform commands themselves
2022-04-21 11:57:26 +0200 <abastro[m]> E.g. loop statement could be intuitive to even beginners
2022-04-21 11:58:08 +0200 <tdammers> kuribas: not all those things are necessarily partial. In some cases, the problem is rather that Haskell largely uses nominal types rather than structural; conceptually, any value inhabits exactly one type. An example of an architecture where this matters is Ring middlewares. For example, you can make a middleware that augments a JSON request with a parsed body; any middlewares that don't care
2022-04-21 11:58:10 +0200 <tdammers> about the parsed payload can just pass it through, but those that do care about it can match on it and use it.
2022-04-21 11:58:28 +0200 <lortabac> kuribas: you would need a whole ecosystem of dynamically-typed Haskell in order to make it really usable
2022-04-21 11:58:28 +0200 <lortabac> and also some syntactic sugar
2022-04-21 11:58:31 +0200pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
2022-04-21 11:58:56 +0200 <tdammers> if we want to do this in Haskell, things get awkward; we need to define separate types for "request without parsed payload" and "request with parsed payload"
2022-04-21 11:59:25 +0200 <tdammers> a structural type system could, in principle, make this more ergonomic, without sacrificing type safety
2022-04-21 12:00:09 +0200acidjnk(~acidjnk@p200300d0c722df61048d478b5774cff4.dip0.t-ipconnect.de)
2022-04-21 12:00:20 +0200 <abastro[m]> Structural type system is also unwieldy in other ways iirc
2022-04-21 12:00:37 +0200 <abastro[m]> How do you do Typeclasses in structural types
2022-04-21 12:01:30 +0200 <kuribas> tdammers: I think higher kinded extensible records are a great solution for this.
2022-04-21 12:01:40 +0200pagnol(~user@014198154145.ctinets.com) (Ping timeout: 246 seconds)
2022-04-21 12:02:44 +0200aman(~aman@user/aman) (Quit: aman)
2022-04-21 12:02:56 +0200 <kuribas> lortabac: yeah, I am thinking about a language that mixes static with dynamic.
2022-04-21 12:03:28 +0200 <lortabac> btw GHC already has Any
2022-04-21 12:03:44 +0200 <abastro[m]> :i Any
2022-04-21 12:03:49 +0200redb(~nmh@136.49.49.211)
2022-04-21 12:03:50 +0200 <lortabac> but you have to unsafeCoerce explicitly in order to use it
2022-04-21 12:04:09 +0200 <abastro[m]> Eh that does not work..
2022-04-21 12:06:22 +0200fendor(~fendor@178.115.48.2.wireless.dyn.drei.com) (Remote host closed the connection)
2022-04-21 12:08:59 +0200redb(~nmh@136.49.49.211) (Ping timeout: 240 seconds)
2022-04-21 12:09:52 +0200infinity0(~infinity0@185.112.146.113)
2022-04-21 12:10:30 +0200dextaa(~dextaa@user/dextaa)
2022-04-21 12:10:50 +0200 <kuribas> > 2 :: Any
2022-04-21 12:10:52 +0200 <lambdabot> error:
2022-04-21 12:10:52 +0200 <lambdabot> • No instance for (Num Any) arising from the literal ‘2’
2022-04-21 12:10:52 +0200 <lambdabot> • In the expression: 2 :: Any
2022-04-21 12:10:59 +0200 <kuribas> > (2 :: Int) :: Any
2022-04-21 12:11:01 +0200 <lambdabot> error:
2022-04-21 12:11:01 +0200 <lambdabot> • Couldn't match expected type ‘Any’ with actual type ‘Int’
2022-04-21 12:11:01 +0200 <lambdabot> • In the expression: (2 :: Int) :: Any
2022-04-21 12:11:21 +0200 <kuribas> > (undefined :: Any) + 2
2022-04-21 12:11:23 +0200 <lambdabot> error:
2022-04-21 12:11:23 +0200 <lambdabot> • No instance for (Num Any) arising from a use of ‘+’
2022-04-21 12:11:23 +0200 <lambdabot> • In the expression: (undefined :: Any) + 2
2022-04-21 12:11:34 +0200 <kuribas> lortabac: yeah.
2022-04-21 12:11:39 +0200 <lortabac> this is another Any
2022-04-21 12:12:22 +0200DNH(~DNH@2a02:8109:b740:2c4:11d5:718e:c7c6:4a90) (Quit: My MacBook has gone to sleep. ZZZzzz…)
2022-04-21 12:12:54 +0200 <lortabac> I'm talking about GHC.Exts.Any
2022-04-21 12:13:43 +0200zebrag(~chris@user/zebrag) (Quit: Konversation terminated!)
2022-04-21 12:17:05 +0200zebrag(~chris@user/zebrag)
2022-04-21 12:17:51 +0200Aseel(~Aseel@175.142.127.212)
2022-04-21 12:18:04 +0200zeenk(~zeenk@2a02:2f04:a313:d600:8d26:ec9f:3ff6:fc94) (Quit: Konversation terminated!)
2022-04-21 12:18:06 +0200pagnol(~user@014198154145.ctinets.com)
2022-04-21 12:18:34 +0200krappix(~krappix@nat-eduroam-76-gw-01-lne.lille.inria.fr)
2022-04-21 12:20:29 +0200 <kuribas> lortabac: how is it different?
2022-04-21 12:21:27 +0200 <krappix> Hello all, how can I convert a string datetime to dataTime data: for example `"2022-04-21T10:13:31Z"` become `{day = 2022-04-21, time = 10:13:31}`
2022-04-21 12:21:44 +0200jmdaemon(~jmdaemon@user/jmdaemon) (Ping timeout: 248 seconds)
2022-04-21 12:22:16 +0200acidjnk(~acidjnk@p200300d0c722df61048d478b5774cff4.dip0.t-ipconnect.de) (Ping timeout: 248 seconds)
2022-04-21 12:22:51 +0200akegalj(~akegalj@93-136-71-186.adsl.net.t-com.hr)
2022-04-21 12:23:10 +0200deadmarshal_(~deadmarsh@95.38.229.55)
2022-04-21 12:23:53 +0200 <merijn> there's a parse function in the time package
2022-04-21 12:23:56 +0200 <merijn> @hackage time
2022-04-21 12:23:56 +0200 <lambdabot> https://hackage.haskell.org/package/time
2022-04-21 12:24:28 +0200 <merijn> Specifically parseTimeM
2022-04-21 12:24:30 +0200 <merijn> https://hackage.haskell.org/package/time-1.12.1/docs/Data-Time-Format.html#v:parseTimeM
2022-04-21 12:25:53 +0200jinsun(~jinsun@user/jinsun) (Read error: Connection reset by peer)
2022-04-21 12:26:08 +0200jinsun(~jinsun@user/jinsun)
2022-04-21 12:28:09 +0200zzz(~z@user/zero) (Ping timeout: 248 seconds)
2022-04-21 12:28:18 +0200deadmarshal_(~deadmarsh@95.38.229.55) (Ping timeout: 276 seconds)
2022-04-21 12:28:53 +0200 <krappix> merijn: thank you
2022-04-21 12:28:56 +0200acidjnk(~acidjnk@p200300d0c722df612d209b48ee4192e4.dip0.t-ipconnect.de)
2022-04-21 12:32:27 +0200eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
2022-04-21 12:32:32 +0200econo(uid147250@user/econo) (Quit: Connection closed for inactivity)
2022-04-21 12:33:30 +0200mmhat(~mmh@55d4dd86.access.ecotel.net) (Ping timeout: 276 seconds)
2022-04-21 12:33:55 +0200mmhat(~mmh@55d4dd86.access.ecotel.net)
2022-04-21 12:36:39 +0200eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 240 seconds)
2022-04-21 12:37:01 +0200Lord_of_Life_(~Lord@user/lord-of-life/x-2819915)
2022-04-21 12:37:21 +0200mcglk(~mcglk@131.191.49.120) (Read error: Connection reset by peer)
2022-04-21 12:38:42 +0200Lord_of_Life(~Lord@user/lord-of-life/x-2819915) (Ping timeout: 276 seconds)
2022-04-21 12:39:02 +0200mcglk(~mcglk@131.191.49.120)
2022-04-21 12:39:03 +0200redb(~nmh@136.49.49.211)
2022-04-21 12:39:42 +0200dextaa9(~dextaa@user/dextaa)
2022-04-21 12:39:45 +0200Lord_of_Life_Lord_of_Life
2022-04-21 12:41:57 +0200dextaa(~dextaa@user/dextaa) (Ping timeout: 276 seconds)
2022-04-21 12:41:57 +0200dextaa9dextaa
2022-04-21 12:42:11 +0200jinsun(~jinsun@user/jinsun) (Ping timeout: 256 seconds)
2022-04-21 12:42:13 +0200jinsun__(~jinsun@user/jinsun)
2022-04-21 12:43:10 +0200krappix(~krappix@nat-eduroam-76-gw-01-lne.lille.inria.fr) (Ping timeout: 250 seconds)
2022-04-21 12:43:54 +0200redb(~nmh@136.49.49.211) (Ping timeout: 276 seconds)
2022-04-21 12:44:50 +0200 <dminuoso> Are there any well maintained haskell libraries that also expose a flake?
2022-04-21 12:44:59 +0200DNH(~DNH@2a02:8109:b740:2c4:11d5:718e:c7c6:4a90)
2022-04-21 12:45:07 +0200 <dminuoso> Trying to get a gist of how haskell packages usually write their flakes
2022-04-21 12:53:29 +0200deadmarshal_(~deadmarsh@95.38.229.55)
2022-04-21 12:54:39 +0200ralu1(~ralu@static.211.245.203.116.clients.your-server.de) (Ping timeout: 240 seconds)
2022-04-21 12:55:52 +0200jgeerds(~jgeerds@d53604b0.access.ecotel.net) (Ping timeout: 248 seconds)
2022-04-21 13:01:53 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net)
2022-04-21 13:02:40 +0200CiaoSen(~Jura@p200300c95732ec002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
2022-04-21 13:02:41 +0200fef(~thedawn@user/thedawn) (Quit: Leaving)
2022-04-21 13:05:33 +0200 <lortabac> kuribas: the Any in lambdabot is the bool monoid (true if at least one element is true)
2022-04-21 13:06:33 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net) (Ping timeout: 256 seconds)
2022-04-21 13:11:59 +0200acidjnk(~acidjnk@p200300d0c722df612d209b48ee4192e4.dip0.t-ipconnect.de) (Ping timeout: 240 seconds)
2022-04-21 13:12:38 +0200redb(~nmh@136.49.49.211)
2022-04-21 13:13:57 +0200aman(~aman@user/aman)
2022-04-21 13:16:24 +0200merijn(~merijn@c-001-001-001.client.esciencecenter.eduvpn.nl) (Ping timeout: 276 seconds)
2022-04-21 13:16:33 +0200 <dminuoso> Unrelatedly, if I bump cabal-version from >=1.10 to 3.0, does this warrant a major version bump?
2022-04-21 13:16:55 +0200akegalj(~akegalj@93-136-71-186.adsl.net.t-com.hr) (Quit: leaving)
2022-04-21 13:16:59 +0200fendor(~fendor@178.115.48.2.wireless.dyn.drei.com)
2022-04-21 13:17:07 +0200 <dminuoso> If I take PVP literally, it seems not
2022-04-21 13:17:26 +0200 <dminuoso> Dunno
2022-04-21 13:17:28 +0200 <dminuoso> "Note that modifying imports or depending on a newer version of another package may cause extra orphan instances to be exported and thus force a major version change.
2022-04-21 13:17:43 +0200 <dminuoso> Is cabal itself "a package you depend upon"?
2022-04-21 13:19:57 +0200 <__monty__> Doesn't cabal-install discard package versions with incompatible cabal-version constraints?
2022-04-21 13:20:50 +0200 <dminuoso> I guess if it did, it doesnt matter
2022-04-21 13:22:54 +0200anomal(~anomal@87.227.196.109) (Remote host closed the connection)
2022-04-21 13:28:37 +0200tromp(~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-04-21 13:29:02 +0200Pickchea(~private@user/pickchea)
2022-04-21 13:30:07 +0200Unicorn_Princess(~Unicorn_P@93-103-228-248.dynamic.t-2.net)
2022-04-21 13:39:40 +0200deadmarshal_(~deadmarsh@95.38.229.55) (Ping timeout: 246 seconds)
2022-04-21 13:42:36 +0200 <kuribas> tdammers: why would a middleware want to pass a parsed request?
2022-04-21 13:44:39 +0200 <kuribas> tdammers: you mean like parse bytestring into JSON, to avoid every middleware having to do that?
2022-04-21 13:46:11 +0200 <kuribas> tdammers: you could use "vault" for that.
2022-04-21 13:46:27 +0200 <kuribas> Create a key for JSON body, and put it in the vault.
2022-04-21 13:46:41 +0200pagnol(~user@014198154145.ctinets.com) (Remote host closed the connection)
2022-04-21 13:46:45 +0200 <kuribas> tdammers: I don't see how this needs dynamic types.
2022-04-21 13:50:42 +0200tromp(~textual@dhcp-077-249-230-040.chello.nl)
2022-04-21 13:51:15 +0200merijn(~merijn@c-001-001-001.client.esciencecenter.eduvpn.nl)
2022-04-21 13:56:25 +0200merijn(~merijn@c-001-001-001.client.esciencecenter.eduvpn.nl) (Ping timeout: 256 seconds)
2022-04-21 13:57:56 +0200 <abastro[m]> What is "vault"?
2022-04-21 13:58:59 +0200Pickchea(~private@user/pickchea) (Ping timeout: 240 seconds)
2022-04-21 14:00:34 +0200meinside(uid24933@id-24933.helmsley.irccloud.com) (Quit: Connection closed for inactivity)
2022-04-21 14:05:37 +0200merijn(~merijn@c-001-001-001.client.esciencecenter.eduvpn.nl)
2022-04-21 14:12:05 +0200 <kuribas> abastro[m]: https://hackage.haskell.org/package/wai-3.2.3/docs/Network-Wai.html#v:vault
2022-04-21 14:12:44 +0200 <abastro[m]> Oh, so an invisible store
2022-04-21 14:14:29 +0200 <kuribas> more like a store that allows you to put any type in it.
2022-04-21 14:14:39 +0200qwedfg(~qwedfg@user/qwedfg) (Ping timeout: 240 seconds)
2022-04-21 14:14:44 +0200 <tdammers> kuribas: it doesn't, that's the thing. The middleware is essentially (Request -> Response) -> (RequestWithMaybeJSONPayload -> Response) or sth like that. Which would work, except that now Request and RequestWithMaybeJSONPayload are no longer the same type, even for non-JSON requests
2022-04-21 14:15:21 +0200 <kuribas> tdammers: put JSON in the vault?
2022-04-21 14:15:45 +0200 <tdammers> that removes the JSON parsing aspect from the type entirely
2022-04-21 14:16:06 +0200JordiGH(~jordi@user/jordigh)
2022-04-21 14:16:32 +0200 <kuribas> so just like the dynamic solution, right?
2022-04-21 14:16:50 +0200 <tdammers> well, vault is kind of out-of-band
2022-04-21 14:17:00 +0200dcoutts__(~duncan@host213-122-143-81.range213-122.btcentralplus.com)
2022-04-21 14:17:10 +0200 <tdammers> the way Ring does it, you just extend the request object with an additional field
2022-04-21 14:17:15 +0200ralu1(~ralu@static.211.245.203.116.clients.your-server.de)
2022-04-21 14:17:26 +0200 <tdammers> I guess you could use some sort of extensible-records solution for that in Haskell
2022-04-21 14:19:07 +0200dcoutts_(~duncan@host213-122-143-81.range213-122.btcentralplus.com) (Ping timeout: 240 seconds)
2022-04-21 14:22:58 +0200aman(~aman@user/aman) (Quit: aman)
2022-04-21 14:26:27 +0200JordiGH(~jordi@user/jordigh) (Ping timeout: 260 seconds)
2022-04-21 14:27:26 +0200Aseel(~Aseel@175.142.127.212) (Remote host closed the connection)
2022-04-21 14:35:34 +0200 <abastro[m]> Static types are often problematic like in this case, I gusss
2022-04-21 14:35:49 +0200 <abastro[m]> I should have said nominal type duh
2022-04-21 14:38:18 +0200`2jt(~jtomas@175.red-83-36-129.dynamicip.rima-tde.net) (Ping timeout: 276 seconds)
2022-04-21 14:38:45 +0200 <abastro[m]> (Hmm I wonder how structural typing could be done well)
2022-04-21 14:41:00 +0200 <tdammers> I've been thinking about that myself (the "structural typing done well" thing)
2022-04-21 14:44:11 +0200 <abastro[m]> Oh, could you give the gist of results?
2022-04-21 14:44:59 +0200 <kuribas> tdammers: but "Application -> Application" doesn't change the type.
2022-04-21 14:45:08 +0200 <kuribas> I don't see how anything other than vault can help here...
2022-04-21 14:45:58 +0200 <kuribas> higher kinded extensible-records are nice since you can have variations of the same kind of data, and also apply generic methods over them.
2022-04-21 14:46:07 +0200 <tdammers> abastro[m]: currently, the results I have are "I will have to make a little toy language to try out a bunch of things", and "I will likely have to sacrifice type inference to a large extent"
2022-04-21 14:46:11 +0200 <kuribas> I am experimenting in idris with them.
2022-04-21 14:46:27 +0200 <abastro[m]> Oh no. Losing type inference..
2022-04-21 14:46:38 +0200 <kuribas> So you can do folds over fields, mapping fields, zipping records, etc...
2022-04-21 14:46:40 +0200 <tdammers> kuribas: obviously the Middleware type would have to change
2022-04-21 14:46:50 +0200 <abastro[m]> It was not fun in Scala with less and unreliable type inference
2022-04-21 14:46:54 +0200 <kuribas> tdammers: so it wouldn't be middleware anymore.
2022-04-21 14:47:16 +0200 <kuribas> Middleware is something transparent between.
2022-04-21 14:47:27 +0200 <abastro[m]> Kuribas, interesting that you could avoid doing lots of proofs
2022-04-21 14:47:42 +0200 <kuribas> abastro[m]: which proofs?
2022-04-21 14:48:10 +0200 <tdammers> oh, if that's your definition, then the clojure one doesn't qualify either, because it's not transparent either
2022-04-21 14:48:28 +0200 <tdammers> idk., call it a "filter" or a "combinator" then
2022-04-21 14:48:32 +0200 <kuribas> yeah, I guess not
2022-04-21 14:49:27 +0200 <kuribas> abastro[m]: the type of map: mapRecord : ({a : k} -> f a -> g a) -> Record f l -> Record g l
2022-04-21 14:49:31 +0200 <abastro[m]> Proofs that the records could be folded, zipped with types matching
2022-04-21 14:49:31 +0200 <abastro[m]> That and extension as well
2022-04-21 14:50:02 +0200 <kuribas> abastro[m]: I have: data RecordList : (k -> Type) -> List (String, k) -> Type
2022-04-21 14:50:09 +0200 <kuribas> abastro[m]: Record is just a wrapper.
2022-04-21 14:51:05 +0200 <kuribas> abastro[m]: "get" involves a "proof" that the field exists.
2022-04-21 14:51:19 +0200 <abastro[m]> Yea, those ones
2022-04-21 14:51:20 +0200 <kuribas> abastro[m]: which interestingly resolves to an integer (the index in the list).
2022-04-21 14:51:32 +0200 <abastro[m]> I wonder if one of the proofs could be problematic
2022-04-21 14:51:46 +0200 <kuribas> abastro[m]: nah, the proof is a simple induction.
2022-04-21 14:52:46 +0200 <kuribas> abastro[m]: and the proof is done automatically by idris.
2022-04-21 14:52:51 +0200 <kuribas> using proof search.
2022-04-21 14:53:04 +0200 <tdammers> so, red herring - my point is, if I want to use the design of that Ring middleware in a nominally typed language, it gets ugly, but that's not because the language is typed, it's because the types are nominal
2022-04-21 14:53:42 +0200 <kuribas> abastro[m]: so idris will just search all constructors for the right type. If found it is then converted to an integer (the index in the list).
2022-04-21 14:54:18 +0200 <abastro[m]> Interesting, so that deptypes could be useful for certain usecases like this
2022-04-21 14:54:56 +0200 <abastro[m]> Sometimes structural types feel like dynamic to me
2022-04-21 14:55:05 +0200 <kuribas> IMO subtypes are problematic.
2022-04-21 14:55:16 +0200 <kuribas> It's better to have polymorphism.
2022-04-21 14:55:24 +0200 <kuribas> with constraints.
2022-04-21 14:55:34 +0200 <kuribas> TypeWithFeature t => t -> ...
2022-04-21 14:55:52 +0200 <kuribas> the constraint can be any proof in fact.
2022-04-21 14:56:12 +0200AlexNoo_AlexNoo
2022-04-21 14:56:45 +0200 <tdammers> kuribas: in general I agree; however, if you're going to do the "incremental enrichment" style processing that clojure people love so much, then this still means you have to introduce a lot of types, with the potential for a combinatorial explosion
2022-04-21 14:56:46 +0200 <kuribas> For example {0 t:String} -> TableInSchema (s:Schema) t => t -> ...
2022-04-21 14:57:33 +0200 <abastro[m]> Extensible records?
2022-04-21 14:57:45 +0200 <abastro[m]> Oh right
2022-04-21 14:58:11 +0200 <abastro[m]> Those records are subtyping-capable ones
2022-04-21 14:59:58 +0200 <abastro[m]> <del>In the end, OOP wins in practical world I guess</del>
2022-04-21 15:00:07 +0200 <kuribas> tdammers: I think it's easier to use a HKD record with Maybe.
2022-04-21 15:01:42 +0200 <tdammers> kuribas: but now you have to tell everyone in the chain about the JSON value you may or may not be adding somewhere along the way, even all the parts of the chain that will do absolutely nothing with it other than pass it along unchanged
2022-04-21 15:02:49 +0200 <abastro[m]> Time to use duck typing?
2022-04-21 15:03:01 +0200 <tdammers> that is exactly what I want to avoid
2022-04-21 15:03:16 +0200 <abastro[m]> What is wrong with duck typing tho
2022-04-21 15:03:33 +0200 <tdammers> in a nutshell: jesus.save() and file.save() aren't the same thing
2022-04-21 15:03:41 +0200 <abastro[m]> It is basis of incredible amount of SW infrastructure
2022-04-21 15:04:10 +0200 <abastro[m]> Yea but some tradeoff is inevitable
2022-04-21 15:07:01 +0200 <abastro[m]> In which way is dynamic typing different?
2022-04-21 15:07:13 +0200acidjnk(~acidjnk@p200300d0c722df617c5129eda301b2dd.dip0.t-ipconnect.de)
2022-04-21 15:07:26 +0200 <abastro[m]> I guess I wrongly equated dynamic typing with duck typing
2022-04-21 15:09:56 +0200 <tdammers> "dynamic typing" means you don't perform type checks; if there are any type errors in your program, it will crash at runtime.
2022-04-21 15:10:38 +0200 <abastro[m]> How about duck typing?
2022-04-21 15:10:55 +0200 <kuribas> tdammers: then use vault?
2022-04-21 15:11:09 +0200 <kuribas> tdammers: either it's in the type, or not, there is nothing between :)
2022-04-21 15:11:19 +0200 <tdammers> duck typing basically means that instead of asking an object "are you a duck", you ask it to quack; if it can quack, then you treat it as a duck
2022-04-21 15:11:49 +0200 <tdammers> kuribas: it should be in the type, yes, but, hmm, let me see if I can come up with a boiled-down example
2022-04-21 15:12:30 +0200 <kuribas> tdammers: make the "extra fields" type polymorphic.
2022-04-21 15:12:42 +0200 <kuribas> tdammers: and then a constraint on that field when you require it to have something.
2022-04-21 15:13:11 +0200boxscape_(~boxscape_@p4ff0b7be.dip0.t-ipconnect.de)
2022-04-21 15:14:10 +0200 <abastro[m]> Oh, so dynamic typing may crash if the type is wrong, before seeing its behavior
2022-04-21 15:14:16 +0200 <boxscape_> It looks like if define a symbol and import a symbol with the same name, and then use it, GHC will prefer the symbol defined in that module, and not say anything about ambiguity. Is that generally true?
2022-04-21 15:14:17 +0200 <boxscape_> for some reason I fully expected an error, but I'd much prefer to rely on the former behavior for a plugin I'm writing
2022-04-21 15:15:15 +0200lottaquestions(~nick@2607:fa49:5041:a200:5fb5:5ae2:e3c1:daee) (Quit: Konversation terminated!)
2022-04-21 15:15:25 +0200 <abastro[m]> Confused because considerable portion of dynamic typing world is consisted of duck typing. I think there should be a good reason why it is so widespread.
2022-04-21 15:17:34 +0200jgeerds(~jgeerds@d53604b0.access.ecotel.net)
2022-04-21 15:18:41 +0200 <boxscape_> duck typing seems like a strange mixture of nominal and structural typing. You're asking whether a value has the right structure by checking if it has a method with the right name
2022-04-21 15:18:45 +0200 <tdammers> duck typing is popular in dynamic languages, because nominal type checks ("is-a") don't really buy you anything
2022-04-21 15:18:47 +0200acidjnk(~acidjnk@p200300d0c722df617c5129eda301b2dd.dip0.t-ipconnect.de) (Ping timeout: 260 seconds)
2022-04-21 15:18:58 +0200 <tdammers> either way, things crash at runtime
2022-04-21 15:19:14 +0200 <tdammers> "this thing isn't declared to be a duck" vs. "this thing cannot quack" - but in both cases, it crashes
2022-04-21 15:19:18 +0200pavonia(~user@user/siracusa)
2022-04-21 15:20:01 +0200 <tdammers> nominal checks however require more ceremony - you have to declare the type and its inheritance chain, and you have to add those type checks before accessing the quack() method
2022-04-21 15:20:14 +0200 <abastro[m]> Yep, it is good enough for dynamic typing
2022-04-21 15:20:33 +0200 <tdammers> it's more that Java-style type checks don't buy you anything in a dynamic language
2022-04-21 15:20:40 +0200 <boxscape_> (actually I guess my previous statement applies to regular structural typing, too, since you check whether record fields have the right names)
2022-04-21 15:20:57 +0200 <tdammers> PHP did cargo-cult Java's class model, including the is-a checks, but in practice, they're pretty much worthless
2022-04-21 15:21:37 +0200 <abastro[m]> Java style type checks lol
2022-04-21 15:21:50 +0200 <dminuoso> tdammers: I guess duck-typing is just an awkward phrasing of protocols/interfaces.
2022-04-21 15:22:06 +0200 <dminuoso> Particularly for languages that lack the formalism to talk about protocols.
2022-04-21 15:22:07 +0200 <abastro[m]> (Imho Java itself is lol. Got a good time at 2000 IT boom)
2022-04-21 15:22:34 +0200 <tdammers> boxscape_: in principle, yes, but 1) the checks are done statically, so they still buy you a lot compared to dynamic duck typing, and 2) you can design the "names" system such that names are actually unique, so "jesus.save" and "file.save" would reference *different* 'save' labels
2022-04-21 15:22:41 +0200 <abastro[m]> I heard protocols are not alike interfaces
2022-04-21 15:22:51 +0200 <abastro[m]> But to my eyes it is closer to interfaces than typeclasses
2022-04-21 15:22:56 +0200 <boxscape_> tdammers right, good point
2022-04-21 15:23:27 +0200 <tdammers> dminuoso: I'd say duck typing is "protocols/interfaces, but implicit, and only checked at runtime"
2022-04-21 15:23:32 +0200 <dminuoso> Yeah.
2022-04-21 15:23:41 +0200 <dminuoso> Sounds about right
2022-04-21 15:24:33 +0200 <dminuoso> Perhaps one important aspect about duck typing that is rarely mentioned, is that duck typing in particular makes sense for languages with monkey patching or meta programming abilities
2022-04-21 15:24:47 +0200 <abastro[m]> Dynamic protocols sound quite good tbh
2022-04-21 15:24:48 +0200 <dminuoso> Say Ruby's method_missing, which you can drive as dynamic as you want
2022-04-21 15:24:56 +0200n3t(n3t@s45.mydevil.net)
2022-04-21 15:25:53 +0200 <dminuoso> Someone else might amend your thing with new methods/capabilities after the fact, allowing to satisfy some particular interface
2022-04-21 15:26:20 +0200 <abastro[m]> OOP at its finest
2022-04-21 15:26:35 +0200 <tdammers> yeah, so if you're going to miss out on static assertions anyway, at least make maximum use of the freedom that gives you
2022-04-21 15:26:45 +0200 <dminuoso> Well, in some sense this is *actual* OOP in the original sense of smalltalk
2022-04-21 15:26:51 +0200 <tdammers> yep
2022-04-21 15:26:58 +0200 <abastro[m]> Oh
2022-04-21 15:27:49 +0200 <abastro[m]> Python is rightful successor of smalltalk then?
2022-04-21 15:27:58 +0200 <dminuoso> Hardly
2022-04-21 15:28:11 +0200 <abastro[m]> Hmm
2022-04-21 15:28:19 +0200 <dminuoso> Quite a many languages offer the capabilities, but it's not widely used and certainly doesnt influence design choices by authors.
2022-04-21 15:28:29 +0200 <dminuoso> The core theme of OOP is that you have these objects that interact by exchanging "messages", they talk to each other.
2022-04-21 15:28:46 +0200 <dminuoso> While objects can have internal state
2022-04-21 15:29:05 +0200 <dminuoso> The only somewhat common example of this pattern Ive seen is in the Erlang world
2022-04-21 15:29:32 +0200 <abastro[m]> Oh, so duck typing is only part of it
2022-04-21 15:30:04 +0200 <abastro[m]> Funny that I saw some ppl consider Erlang as functional (along with oop ofc)
2022-04-21 15:30:47 +0200 <boxscape_> this looks like a good explanation of Alan Kay's original view of OOP https://ovid.github.io/articles/alan-kay-and-oo-programming.html
2022-04-21 15:33:42 +0200 <abastro[m]> Enterprise OOP got bigger though, because ppl love blunt classification
2022-04-21 15:34:56 +0200Major_Biscuit(~MajorBisc@c-001-009-046.client.tudelft.eduvpn.nl) (Quit: WeeChat 3.4)
2022-04-21 15:35:30 +0200 <abastro[m]> E.g. "A bat is a bird, it can fly and has similar behaviors"
2022-04-21 15:37:35 +0200 <geekosaur> which is still slightly better than "a bat is a mouse with wings"
2022-04-21 15:38:23 +0200 <exarkun> https://stackoverflow.com/questions/13737458/cycle-in-type-synonym-declarations why is the type in the question not allowed but the newtype in the answer is allowed
2022-04-21 15:39:00 +0200wroathe(~wroathe@206-55-188-8.fttp.usinternet.com)
2022-04-21 15:39:00 +0200wroathe(~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host)
2022-04-21 15:39:00 +0200wroathe(~wroathe@user/wroathe)
2022-04-21 15:39:00 +0200 <merijn> exarkun: type synonyms are effectively just textual aliases
2022-04-21 15:39:00 +0200 <boxscape_> ah, hm, looks like what I said above about ambiguous names is actually only true in ghci, in ghc you do get an error :/
2022-04-21 15:39:21 +0200 <merijn> exarkun: so a cyclic/recursive definition would expand to infinite size during type checking
2022-04-21 15:39:32 +0200abastro[m]sent a hs code block: https://libera.ems.host/_matrix/media/r0/download/libera.chat/483e85e0656278159253d51df5df0abb2ad7…
2022-04-21 15:39:33 +0200 <merijn> exarkun: A newtype creates a new *opaque* type
2022-04-21 15:39:56 +0200 <merijn> exarkun: Which means the expansion only happens when you "unpack" the newtype, which happens one finite step at a time
2022-04-21 15:40:01 +0200 <geekosaur> boxscape_, yes, in ghci every line shadows every preceding line and creates a new local declaration
2022-04-21 15:40:13 +0200 <merijn> (very handwavy explanation, but that's the gist)
2022-04-21 15:40:55 +0200 <boxscape_> geekosaur and right, makes sense that it would work if it's being treated as a local declaration
2022-04-21 15:40:59 +0200 <boxscape_> s/and/ah
2022-04-21 15:41:28 +0200frost(~frost@user/frost) (*.net *.split)
2022-04-21 15:41:28 +0200hololeap(~hololeap@user/hololeap) (*.net *.split)
2022-04-21 15:41:28 +0200littlebobeep(~alMalsamo@gateway/tor-sasl/almalsamo) (*.net *.split)
2022-04-21 15:41:28 +0200bitdex(~bitdex@gateway/tor-sasl/bitdex) (*.net *.split)
2022-04-21 15:41:28 +0200gehmehgeh(~user@user/gehmehgeh) (*.net *.split)
2022-04-21 15:41:28 +0200FinnElija(~finn_elij@user/finn-elija/x-0085643) (*.net *.split)
2022-04-21 15:41:28 +0200ChaiTRex(~ChaiTRex@user/chaitrex) (*.net *.split)
2022-04-21 15:41:28 +0200azimut(~azimut@gateway/tor-sasl/azimut) (*.net *.split)
2022-04-21 15:41:28 +0200adanwan(~adanwan@gateway/tor-sasl/adanwan) (*.net *.split)
2022-04-21 15:41:28 +0200chexum(~quassel@gateway/tor-sasl/chexum) (*.net *.split)
2022-04-21 15:41:28 +0200jpds(~jpds@gateway/tor-sasl/jpds) (*.net *.split)
2022-04-21 15:41:28 +0200califax(~califax@user/califx) (*.net *.split)
2022-04-21 15:41:28 +0200stiell_(~stiell@gateway/tor-sasl/stiell) (*.net *.split)
2022-04-21 15:41:35 +0200 <merijn> exarkun: In essence, the type synonym is an infinitely big (and thus irrepresentible in the type checker) term, whereas the newtype is a finite (but recursive) one
2022-04-21 15:41:38 +0200 <geekosaur> ghci is just a bit weird, but it'd be even weirder if it behaved like an actual file
2022-04-21 15:41:54 +0200 <boxscape_> so ghci kind of has local type declarations
2022-04-21 15:42:08 +0200 <exarkun> merijn: Should I be concerned with why this difference exists, or is it just because?
2022-04-21 15:42:09 +0200akegalj(~akegalj@141-136-168-234.dsl.iskon.hr)
2022-04-21 15:43:10 +0200tromp(~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-04-21 15:43:19 +0200JordiGH(~jordi@user/jordigh)
2022-04-21 15:43:24 +0200 <merijn> exarkun: I'd say it's due to a bit of a misnomer of type (which kinda implies it's defining a new (ha!) type, but is really defining a synonym/textual alias, whereas newtype defines a, well, new type ;)
2022-04-21 15:43:37 +0200 <geekosaur> ghci makes a little moresense if you treat it as the inside of a `do` (which was the original intent)
2022-04-21 15:43:49 +0200 <abastro[m]> I think newtypes are effectively datatypes, but they are optimized so that the conversion takes no cost in runtine.
2022-04-21 15:44:07 +0200 <merijn> exarkun: So when you write "type Foo = Int" you can use Foo and Int interchangably. If you write "newtype Foo = Foo Int" you need to explicitly wrap/unwrap Foo to get an Int
2022-04-21 15:44:10 +0200 <boxscape_> geekosaur right, do + the ability to declare types
2022-04-21 15:44:35 +0200 <boxscape_> (which also shadow imports
2022-04-21 15:44:37 +0200 <boxscape_> )
2022-04-21 15:44:45 +0200 <exarkun> merijn: okay, I might understand that. thanks.
2022-04-21 15:44:54 +0200 <abastro[m]> exarkun I'd say `type` is like macros
2022-04-21 15:45:08 +0200 <abastro[m]> Tho I'd be quite wrong with this
2022-04-21 15:45:23 +0200 <abastro[m]> They do behave somewhat alike typedef in C
2022-04-21 15:45:56 +0200 <geekosaur> it creates an alias in the typechecker
2022-04-21 15:46:21 +0200redb(~nmh@136.49.49.211) (Ping timeout: 256 seconds)
2022-04-21 15:47:47 +0200zer0bitz(~zer0bitz@2001:2003:f444:8f00:7182:b1bf:175f:4221)
2022-04-21 15:47:59 +0200Pickchea(~private@user/pickchea)
2022-04-21 15:49:25 +0200 <abastro[m]> Type alias, yea that should be better and correct term
2022-04-21 15:49:55 +0200abastro(~abab9579@220.75.216.63)
2022-04-21 15:51:18 +0200xff0x_(~xff0x@om126194210237.10.openmobile.ne.jp)
2022-04-21 15:52:05 +0200jonathanx(~jonathan@h-178-174-176-109.A357.priv.bahnhof.se)
2022-04-21 15:52:16 +0200 <dminuoso> Maybe we should have named `type` `alias`, and `newtype` just `type`. :)
2022-04-21 15:52:30 +0200 <dminuoso> But alas, hysterical raisins.
2022-04-21 15:52:35 +0200 <abastro> Great naming!
2022-04-21 15:52:44 +0200 <abastro> Btw what does alias does, exactly?
2022-04-21 15:52:54 +0200 <geekosaur> all three are kinda misnamed, but it's far too late now
2022-04-21 15:53:16 +0200 <abastro> Idris do took `data` IIRC
2022-04-21 15:53:20 +0200 <abastro> Or perhaps I misremembered
2022-04-21 15:53:36 +0200 <boxscape_> Idris took most of the Haskell98 syntax
2022-04-21 15:53:48 +0200 <dminuoso> It's just a bit sad because while it doesn't really have a meaningful impact on advanced users of Haskell, it does present one other hurdle for newcomers.
2022-04-21 15:53:54 +0200 <abastro> `type A = B` does not literally replace all occurrences of A with B, right?
2022-04-21 15:54:02 +0200 <dminuoso> abastro: correct
2022-04-21 15:54:20 +0200 <dminuoso> abastro: once you have type aliases you get a whole lot of fun in GHC in facft.
2022-04-21 15:54:21 +0200 <abastro> Yep, as it does not literally replace, what does it do?
2022-04-21 15:54:31 +0200 <dminuoso> Sometimes GHC will show you the aliased name, sometimes not..
2022-04-21 15:54:35 +0200 <Alex_test> [quote=Falcon post_id=437033 time=1650547944 user_id=7]
2022-04-21 15:54:35 +0200 <Alex_test> ����� ��� � ������������� ������ "�������� ��������"! *��������*
2022-04-21 15:54:35 +0200 <Alex_test> [/quote]
2022-04-21 15:54:35 +0200 <Alex_test> �������?!?!
2022-04-21 15:54:35 +0200 <Alex_test> ������� ������� �.�. �., ������... *������*
2022-04-21 15:54:51 +0200 <dminuoso> Heck, you sometimes have something like Expected `[Unaliased]` but got `Aliased`
2022-04-21 15:54:56 +0200 <dminuoso> Real fun this way
2022-04-21 15:55:13 +0200 <Alex_test> ��.
2022-04-21 15:55:35 +0200 <dminuoso> abastro: its just a statement of equality . `type T = Int` is just saying these two things are the same thing.
2022-04-21 15:55:45 +0200 <abastro> I see
2022-04-21 15:55:45 +0200 <dminuoso> That means you can substitute one for the other anywhere
2022-04-21 15:55:50 +0200 <abastro> So implementation dependent it is
2022-04-21 15:55:54 +0200 <dminuoso> No, not at all
2022-04-21 15:55:56 +0200 <dminuoso> That's the point
2022-04-21 15:55:58 +0200 <abastro> I mean
2022-04-21 15:56:27 +0200 <abastro> Whether GHC would replace occurrences of `T` to `Int` for `type T = Int`
2022-04-21 15:57:27 +0200 <dminuoso> If you specify -fprint-expanded-synonyms it will always expand all mentions to the expanded type
2022-04-21 15:57:33 +0200 <dminuoso> If not, it's largely implementation dependent
2022-04-21 15:58:14 +0200 <dminuoso> Now before you imagine -fprint-expanded-synonyms to be something you would always want
2022-04-21 15:58:41 +0200cdman(~dcm@user/dmc/x-4369397) (Quit: Leaving)
2022-04-21 15:58:48 +0200 <boxscape_> abastro there are some things that wouldn't be true if it would just replace it, like e.g. in Haskell98 you can't use type synonyms in instances, though with -XTypeSynonymInstances you can
2022-04-21 15:58:52 +0200 <abastro> How does GHC even manage to print with all these?
2022-04-21 15:59:02 +0200 <dminuoso> age :: Lens T Int
2022-04-21 15:59:04 +0200 <dminuoso> looks nice
2022-04-21 15:59:12 +0200 <abastro> Oh I mean
2022-04-21 15:59:27 +0200 <abastro> How does GHC manage to type check with all the type aliases/
2022-04-21 15:59:31 +0200 <abastro> It must be "fun"
2022-04-21 16:00:20 +0200 <dminuoso> I dont think this is a particular challenge
2022-04-21 16:00:56 +0200 <abastro> Why?
2022-04-21 16:00:57 +0200califax(~califax@user/califx)
2022-04-21 16:01:03 +0200FinnElija(~finn_elij@user/finn-elija/x-0085643)
2022-04-21 16:01:11 +0200adanwan(~adanwan@gateway/tor-sasl/adanwan)
2022-04-21 16:01:15 +0200azimut(~azimut@gateway/tor-sasl/azimut)
2022-04-21 16:01:18 +0200 <dminuoso> As long as you know T is a type synonym, you could either always normalize, or just rig an type equality check to normalize whenever the other thing is not a type alias?
2022-04-21 16:01:19 +0200chexum(~quassel@gateway/tor-sasl/chexum)
2022-04-21 16:01:41 +0200 <abastro> I see, interesting
2022-04-21 16:01:54 +0200gehmehgeh(~user@user/gehmehgeh)
2022-04-21 16:01:56 +0200 <dminuoso> The former is a bit simpler, but a bit more annoying on diagnostics
2022-04-21 16:02:00 +0200 <dminuoso> Given my above example:
2022-04-21 16:02:03 +0200 <dminuoso> age :: Lens T Int
2022-04-21 16:02:14 +0200jpds(~jpds@gateway/tor-sasl/jpds)
2022-04-21 16:02:15 +0200 <geekosaur> the only "fun" part about it is trying to remember when an alias was used so the error messages better match the source
2022-04-21 16:02:15 +0200littlebobeep(~alMalsamo@gateway/tor-sasl/almalsamo)
2022-04-21 16:02:18 +0200 <dminuoso> type Lens s t a b = forall f . Functor f => (a -> f b) -> s -> f t
2022-04-21 16:02:41 +0200 <dminuoso> The left hand side is nice to look at, the right hand side is not.
2022-04-21 16:03:03 +0200 <abastro> I see. Btw... <del>value alias in haskell when</del>
2022-04-21 16:03:05 +0200slack1256(~slack1256@191.126.99.203)
2022-04-21 16:03:06 +0200bitdex(~bitdex@gateway/tor-sasl/bitdex)
2022-04-21 16:03:15 +0200 <geekosaur> let-in
2022-04-21 16:03:21 +0200hololeap(~hololeap@user/hololeap)
2022-04-21 16:05:11 +0200 <abastro> `let` enables sharing, no?
2022-04-21 16:05:37 +0200 <abastro> I heard `type` does not enable sharing of the involved types
2022-04-21 16:06:25 +0200deadmarshal_(~deadmarsh@95.38.229.55)
2022-04-21 16:06:32 +0200 <dminuoso> type-level evaluation works almost, but not quite, entirely different from value-level evaluation
2022-04-21 16:06:37 +0200 <dminuoso> Not sure what "sharing" would even mean at the type level
2022-04-21 16:06:41 +0200ChaiTRex(~ChaiTRex@user/chaitrex)
2022-04-21 16:07:54 +0200 <abastro> Now I wonder how dependent typing would even be possible
2022-04-21 16:08:00 +0200 <abastro> With such distinctions
2022-04-21 16:08:40 +0200stiell_(~stiell@gateway/tor-sasl/stiell)
2022-04-21 16:09:09 +0200redb(~nmh@136.49.49.211)
2022-04-21 16:10:32 +0200tromp(~textual@dhcp-077-249-230-040.chello.nl)
2022-04-21 16:12:30 +0200[itchyjunk](~itchyjunk@user/itchyjunk/x-7353470)
2022-04-21 16:12:39 +0200wroathe(~wroathe@user/wroathe) (Ping timeout: 240 seconds)
2022-04-21 16:12:45 +0200nehsou^(~nehsou@50-192-56-193-static.hfc.comcastbusiness.net) (Remote host closed the connection)
2022-04-21 16:13:19 +0200redb(~nmh@136.49.49.211) (Ping timeout: 246 seconds)
2022-04-21 16:13:24 +0200 <geekosaur> let *may* enable sharing, it's up to the compiler
2022-04-21 16:13:34 +0200 <geekosaur> types, it's not clear that "sharing" is a concept
2022-04-21 16:13:54 +0200 <abastro> Oh noo.. I thought it was enforced.
2022-04-21 16:13:58 +0200 <geekosaur> in a language like Omega it would
2022-04-21 16:14:06 +0200 <geekosaur> I believe ghc takes it as a hint
2022-04-21 16:14:25 +0200 <abastro> I again reveals that my haskell is not properly learned
2022-04-21 16:15:09 +0200 <boxscape_> dminuoso presumably sharing would mean that if you have `type Sum = 3 + 5`, 3 + 5 is only computed once, regardless of how often you use the type Sum
2022-04-21 16:15:34 +0200littlebobeep(~alMalsamo@gateway/tor-sasl/almalsamo) (Ping timeout: 240 seconds)
2022-04-21 16:15:55 +0200Guest97(~Guest97@2804:4d98:3001:15:db7c:f54a:d2b3:85db)
2022-04-21 16:16:12 +0200 <dminuoso> boxscape_: Oh boy, now I want TypeTrace!
2022-04-21 16:16:14 +0200Katarushisu(~Katarushi@cpc147334-finc20-2-0-cust27.4-2.cable.virginm.net) (Quit: The Lounge - https://thelounge.chat)
2022-04-21 16:16:21 +0200 <boxscape_> oh yeah, that would be nice
2022-04-21 16:16:30 +0200waleee(~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340)
2022-04-21 16:16:34 +0200Katarushisu(~Katarushi@cpc147334-finc20-2-0-cust27.4-2.cable.virginm.net)
2022-04-21 16:16:56 +0200 <boxscape_> maybe you can implement it with custom type warnings https://github.com/ghc-proposals/ghc-proposals/pull/454
2022-04-21 16:17:02 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net)
2022-04-21 16:17:13 +0200 <dminuoso> boxscape_: but anyway, I dont have any real type theory expertise to presume to know whether sharing at the type level even makes sense.
2022-04-21 16:17:25 +0200 <dminuoso> In the presence of type inference and all
2022-04-21 16:17:35 +0200 <boxscape_> fair, same here I suppose
2022-04-21 16:17:42 +0200marquis_andras(~marquis_a@14-201-230-116.tpgi.com.au) (Ping timeout: 260 seconds)
2022-04-21 16:18:23 +0200 <abastro> TypeTrace XD
2022-04-21 16:18:39 +0200gurkenglas(~gurkengla@dslb-178-012-018-212.178.012.pools.vodafone-ip.de) (Ping timeout: 256 seconds)
2022-04-21 16:19:35 +0200bitdex(~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection)
2022-04-21 16:19:46 +0200Guest97(~Guest97@2804:4d98:3001:15:db7c:f54a:d2b3:85db) (Client Quit)
2022-04-21 16:20:33 +0200bitdex(~bitdex@gateway/tor-sasl/bitdex)
2022-04-21 16:21:56 +0200pie_(~pie_bnc@user/pie/x-2818909) (Quit: pie_)
2022-04-21 16:23:21 +0200littlebobeep(~alMalsamo@gateway/tor-sasl/almalsamo)
2022-04-21 16:26:06 +0200sammelweis_(~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10) (Remote host closed the connection)
2022-04-21 16:26:23 +0200redb(~nmh@136.49.49.211)
2022-04-21 16:28:32 +0200vicfred(~vicfred@user/vicfred)
2022-04-21 16:28:36 +0200 <abastro> https://paste.tomsmeding.com/8AqrxpWX
2022-04-21 16:28:59 +0200 <abastro> I guess I like having fun with useless abstractions
2022-04-21 16:29:31 +0200marquis_andras(~marquis_a@110-175-153-86.static.tpgi.com.au)
2022-04-21 16:30:52 +0200redb(~nmh@136.49.49.211) (Ping timeout: 250 seconds)
2022-04-21 16:31:34 +0200 <dminuoso> abastro: Lookup TOCTOU
2022-04-21 16:31:43 +0200MajorBiscuit(~MajorBisc@c-001-009-046.client.tudelft.eduvpn.nl)
2022-04-21 16:31:47 +0200 <dminuoso> On a multi-user system that code has TOCTOU races
2022-04-21 16:32:21 +0200pie_(~pie_bnc@user/pie/x-2818909)
2022-04-21 16:32:28 +0200pie_(~pie_bnc@user/pie/x-2818909) (Client Quit)
2022-04-21 16:32:40 +0200 <abastro> You got why I said "useless"
2022-04-21 16:33:38 +0200 <abastro> But if my executable is working on a directory not intended for user access and user accessed anyway, is it my fault?
2022-04-21 16:33:41 +0200pie_(~pie_bnc@user/pie/x-2818909)
2022-04-21 16:35:12 +0200benin(~benin@183.82.204.110) (Quit: The Lounge - https://thelounge.chat)
2022-04-21 16:36:04 +0200deadmarshal_(~deadmarsh@95.38.229.55) (Ping timeout: 246 seconds)
2022-04-21 16:41:39 +0200pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Ping timeout: 240 seconds)
2022-04-21 16:42:52 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net) (Remote host closed the connection)
2022-04-21 16:43:27 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net)
2022-04-21 16:43:48 +0200 <maerwald_> that's why I dislike the 'path' package
2022-04-21 16:43:55 +0200 <maerwald_> It makes that distinction as well
2022-04-21 16:44:27 +0200michalz(~michalz@185.246.204.58) (Remote host closed the connection)
2022-04-21 16:45:51 +0200shriekingnoise(~shrieking@201.231.16.156)
2022-04-21 16:47:53 +0200 <abastro> Oh, path package existed
2022-04-21 16:48:06 +0200 <abastro> Apparently it depends on heavyweight aeson
2022-04-21 16:48:19 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net) (Ping timeout: 246 seconds)
2022-04-21 16:48:20 +0200sammelweis(~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10)
2022-04-21 16:49:10 +0200pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
2022-04-21 16:49:16 +0200 <abastro> Is it really bad if I assume no one should interfere with certain directories in my program?
2022-04-21 16:49:34 +0200 <maerwald_> yes
2022-04-21 16:49:41 +0200 <maerwald_> the filesystem is mutable
2022-04-21 16:50:19 +0200 <abastro> Then how do I manage the directories
2022-04-21 16:52:20 +0200 <maerwald_> you handle failure when you operate on the file, so filesystem code usually has a lot of try/catch
2022-04-21 16:52:36 +0200 <maerwald_> and you try to avoid checking the file type explicitly
2022-04-21 16:52:57 +0200emad(~emad@102.47.204.93)
2022-04-21 16:53:24 +0200emad(~emad@102.47.204.93) (Remote host closed the connection)
2022-04-21 16:53:57 +0200 <abastro> I mean, isn't throwing IO exception equal to "We would not care about this specific case"
2022-04-21 16:54:07 +0200 <abastro> oh you mean handling every possible exceptions
2022-04-21 16:54:46 +0200Sgeo(~Sgeo@user/sgeo)
2022-04-21 16:54:47 +0200ec(~ec@gateway/tor-sasl/ec)
2022-04-21 16:54:48 +0200merijn(~merijn@c-001-001-001.client.esciencecenter.eduvpn.nl) (Ping timeout: 276 seconds)
2022-04-21 16:56:28 +0200 <abastro> But that's not always practical
2022-04-21 16:56:29 +0200 <geekosaur> you don't have to catch every possible exception, but for example if you expect a file and it's a directory then openFile will throw (except with a local directory on *bsd)
2022-04-21 16:57:50 +0200 <abastro> Yep, I think in some cases, one just want to throw the error as "unexpected"
2022-04-21 16:58:17 +0200 <abastro> Because it is likely a user error or hardware fault
2022-04-21 16:58:49 +0200akegalj(~akegalj@141-136-168-234.dsl.iskon.hr) (Ping timeout: 246 seconds)
2022-04-21 16:59:02 +0200redb(~nmh@136.49.49.211)
2022-04-21 16:59:21 +0200 <abastro> I think for small scripts, if I created a directory for my executable's usage, and someone modified it, then it is okay to throw error
2022-04-21 16:59:45 +0200elkcl(~elkcl@broadband-37-110-156-162.ip.moscow.rt.ru) (Read error: Connection reset by peer)
2022-04-21 16:59:58 +0200elkcl(~elkcl@broadband-37-110-156-162.ip.moscow.rt.ru)
2022-04-21 17:01:05 +0200dextaa(~dextaa@user/dextaa) (Remote host closed the connection)
2022-04-21 17:02:15 +0200dextaa(~dextaa@user/dextaa)
2022-04-21 17:02:31 +0200 <abastro[m]> But yeah, "this directory better exists so I can avoid creating it by mistake" is dumb
2022-04-21 17:03:00 +0200dextaa(~dextaa@user/dextaa) (Remote host closed the connection)
2022-04-21 17:03:03 +0200 <abastro[m]> Still think Executable part is worth remaining tho
2022-04-21 17:03:43 +0200abastro(~abab9579@220.75.216.63) (Ping timeout: 260 seconds)
2022-04-21 17:03:50 +0200 <abastro[m]> As I dislike when suddenly `/usr/bin/sudo` disappears
2022-04-21 17:04:11 +0200 <abastro[m]> (Could happen regularly I guess)
2022-04-21 17:05:34 +0200lortabac(~lortabac@2a01:e0a:541:b8f0:8b3f:8bd5:3852:70b0) (Quit: WeeChat 2.8)
2022-04-21 17:05:48 +0200dextaa(~dextaa@user/dextaa)
2022-04-21 17:05:50 +0200 <abastro[m]> If filesystem is mutable, how do you manage cleaning up files?
2022-04-21 17:07:09 +0200redb(~nmh@136.49.49.211) (Ping timeout: 276 seconds)
2022-04-21 17:07:34 +0200dextaa(~dextaa@user/dextaa) (Remote host closed the connection)
2022-04-21 17:07:35 +0200xff0x_(~xff0x@om126194210237.10.openmobile.ne.jp) (Read error: Connection reset by peer)
2022-04-21 17:09:01 +0200dextaa(~dextaa@user/dextaa)
2022-04-21 17:11:14 +0200 <abastro[m]> Is "trying to remove files" enough?
2022-04-21 17:14:35 +0200dextaa(~dextaa@user/dextaa) (Remote host closed the connection)
2022-04-21 17:14:59 +0200 <c_wraith> there are hierarchies of how much to care. Is the file in a user-owned application-specific space? Then if something else the user does interferes with it, that's their fault.
2022-04-21 17:15:07 +0200maerwald_(~maerwald@mail.hasufell.de) (Changing host)
2022-04-21 17:15:07 +0200maerwald_(~maerwald@user/maerwald)
2022-04-21 17:15:15 +0200maerwald_maerwald
2022-04-21 17:15:17 +0200 <c_wraith> Is the file in the shared temporary space? Best not to expect anything of it
2022-04-21 17:15:37 +0200 <c_wraith> and there's a spectrum in between
2022-04-21 17:15:44 +0200dextaa(~dextaa@user/dextaa)
2022-04-21 17:15:52 +0200redb(~nmh@136.49.49.211)
2022-04-21 17:16:07 +0200 <maerwald> abastro[m]: removePathForcibly
2022-04-21 17:16:17 +0200 <maerwald> and on windows, you also need retry strategies due to file locking
2022-04-21 17:17:23 +0200 <c_wraith> The most dangerous cases are when you're writing a long-running program that will run with elevated privileges that creates temporary files in /tmp.
2022-04-21 17:17:48 +0200 <abastro[m]> c_wraith: yea, I assume it is in user-owned app-specific space. So I think it's okay to crash while doing restartable tasks
2022-04-21 17:18:18 +0200 <abastro[m]> maerwald: Surely `removePathForcibly` can fail
2022-04-21 17:18:24 +0200 <maerwald> sure
2022-04-21 17:18:32 +0200 <maerwald> you just `try` it an ignore errors then
2022-04-21 17:18:50 +0200 <abastro[m]> c_wraith: oh no, elevated privilege
2022-04-21 17:19:11 +0200 <abastro[m]> Yea, in the end, there is a scope in which you ignore vs consider
2022-04-21 17:19:16 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net)
2022-04-21 17:20:30 +0200 <maerwald> hideError errs = handleIO (\e -> if ioeGetErrorType e `elem` errs then pure () else liftIO . ioError $ e)
2022-04-21 17:21:33 +0200redb(~nmh@136.49.49.211) (Ping timeout: 256 seconds)
2022-04-21 17:23:53 +0200 <abastro[m]> Accumulating errors to log might be good hmm
2022-04-21 17:24:09 +0200kenran(~kenran@200116b82be0c90001725bbb0612ecd3.dip.versatel-1u1.de)
2022-04-21 17:24:14 +0200 <abastro[m]> Wait I could just `stderr`
2022-04-21 17:25:19 +0200 <geekosaur> until you have multiple threads and they interleave
2022-04-21 17:25:59 +0200justsomeguy(~justsomeg@user/justsomeguy) (Ping timeout: 240 seconds)
2022-04-21 17:30:20 +0200merijn(~merijn@c-001-001-001.client.esciencecenter.eduvpn.nl)
2022-04-21 17:32:53 +0200Pickchea(~private@user/pickchea) (Ping timeout: 256 seconds)
2022-04-21 17:33:22 +0200pagnol(~user@014198154145.ctinets.com)
2022-04-21 17:34:52 +0200merijn(~merijn@c-001-001-001.client.esciencecenter.eduvpn.nl) (Ping timeout: 246 seconds)
2022-04-21 17:35:10 +0200 <abastro[m]> Hehe
2022-04-21 17:35:11 +0200 <abastro[m]> Wait that could be messup
2022-04-21 17:36:01 +0200 <abastro[m]> "Error: Foo"... (full message at https://libera.ems.host/_matrix/media/r0/download/libera.chat/16cd4b824228d3f7911017caf66cb8acc933…)
2022-04-21 17:36:48 +0200 <geekosaur> it gets pretty bad, yep
2022-04-21 17:37:09 +0200 <geekosaur> especially since buffering doesn't work the same way in Haskell as in C
2022-04-21 17:39:34 +0200jpds(~jpds@gateway/tor-sasl/jpds) (Ping timeout: 240 seconds)
2022-04-21 17:39:49 +0200_ht(~quassel@231-169-21-31.ftth.glasoperator.nl)
2022-04-21 17:42:26 +0200redb(~nmh@136.49.49.211)
2022-04-21 17:43:09 +0200jpds(~jpds@gateway/tor-sasl/jpds)
2022-04-21 17:44:56 +0200 <abastro[m]> Is it different in C?
2022-04-21 17:45:18 +0200zaquest(~notzaques@5.130.79.72) (Remote host closed the connection)
2022-04-21 17:45:59 +0200jgeerds(~jgeerds@d53604b0.access.ecotel.net) (Ping timeout: 240 seconds)
2022-04-21 17:46:23 +0200zaquest(~notzaques@5.130.79.72)
2022-04-21 17:46:54 +0200 <geekosaur> C's string output will write to the buffer as a chunk. Haskell's putStr is literally mapM_ putChar, so another thread can interleave at the character level
2022-04-21 17:46:59 +0200akegalj(~akegalj@141-136-168-234.dsl.iskon.hr)
2022-04-21 17:48:06 +0200 <c_wraith> yeah, you discover that very quickly if you're doing output from multiple threads.
2022-04-21 17:48:07 +0200waleee(~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) (Ping timeout: 260 seconds)
2022-04-21 17:48:19 +0200 <abastro[m]> Now that is another gripe of String
2022-04-21 17:48:31 +0200 <pagnol> does this correspond to anything in Haskell or cat theory? https://ramdajs.com/docs/#applySpec
2022-04-21 17:48:41 +0200 <pagnol> (minus the recursion)
2022-04-21 17:49:19 +0200 <c_wraith> that looks a lot like a catamorphism
2022-04-21 17:49:34 +0200 <c_wraith> which is a fancy word for a specific kind of fold
2022-04-21 17:49:48 +0200 <pagnol> means nothing to me but I'll look into it, thanks
2022-04-21 17:50:07 +0200pagnol(~user@014198154145.ctinets.com) (Remote host closed the connection)
2022-04-21 17:51:13 +0200 <c_wraith> oh, I misread. too bad they didn't stick around for a correction.
2022-04-21 17:51:48 +0200pagnol(~user@014198154145.ctinets.com)
2022-04-21 17:52:10 +0200 <c_wraith> pagnol: I misread. that's not it at all
2022-04-21 17:52:20 +0200 <pagnol> c_wraith: my battery died, did you write anything more in response to my question?
2022-04-21 17:52:28 +0200 <abastro[m]> Weird mix of record
2022-04-21 17:52:48 +0200carl(~carl@120.244.220.166)
2022-04-21 17:52:54 +0200 <c_wraith> yeah, I wrote "I misread, it's not a catamorphism at all"
2022-04-21 17:53:03 +0200 <abastro[m]> The API looks like weird mix of records to me*
2022-04-21 17:54:19 +0200 <pagnol> If we disregard the recursion/nesting, then it's somewhat like A -> Map String (A -> ... whatever )
2022-04-21 17:54:23 +0200 <c_wraith> I don't think that's anything especially interesting theoretically. maybe you could claim there's something interesting about the preservation of shape, but mostly it's a convenient shorthand for constructing a flavor of function
2022-04-21 17:54:36 +0200 <hololeap> kinda looks like: Map k (a -> v) -> a -> Map k v
2022-04-21 17:55:45 +0200 <pagnol> ah yes
2022-04-21 17:55:52 +0200coot(~coot@213.134.190.95) (Quit: coot)
2022-04-21 17:56:26 +0200coot(~coot@213.134.190.95)
2022-04-21 17:56:39 +0200machinedgod(~machinedg@24.105.81.50) (Ping timeout: 240 seconds)
2022-04-21 17:57:07 +0200 <pagnol> maybe in Haskell it's a bit awkward due to the lack of a proper record type, but I find myself reaching for this pattern in other languages quite often
2022-04-21 17:58:17 +0200 <c_wraith> > sequence (M.fromList [("foo", (+1))]) 1
2022-04-21 17:58:18 +0200 <lambdabot> fromList [("foo",2)]
2022-04-21 17:58:28 +0200 <abastro[m]> For the specified example there, one can use Monoid
2022-04-21 17:58:39 +0200 <c_wraith> or just sequence.
2022-04-21 17:59:12 +0200 <abastro[m]> > foldMap (\a -> (Sum a, Product a)) [1..5]
2022-04-21 17:59:12 +0200 <pagnol> well usually one would like to use the type system to make sure that exactly certain keys are present
2022-04-21 17:59:14 +0200 <lambdabot> (Sum {getSum = 15},Product {getProduct = 120})
2022-04-21 18:00:03 +0200 <abastro[m]> Instead of a tuple, one could create record datatype which implements Monoid
2022-04-21 18:00:29 +0200 <c_wraith> if you have a data type, just make it Traversable
2022-04-21 18:01:12 +0200 <c_wraith> that gets you basically the functionality there.
2022-04-21 18:02:20 +0200 <c_wraith> of course, you typically wouldn't require that all your fields be the same type in Haskell. that's where things get more complex.
2022-04-21 18:02:32 +0200 <pagnol> right
2022-04-21 18:03:38 +0200lbseale(~ep1ctetus@user/ep1ctetus)
2022-04-21 18:04:37 +0200 <abastro[m]> I don't think we would get this kind of pattern that often in nominally typed languages
2022-04-21 18:05:12 +0200 <abastro[m]> Could be useful for js
2022-04-21 18:05:48 +0200 <c_wraith> we certainly have "build a record from an input"
2022-04-21 18:06:14 +0200 <c_wraith> it just tends to get abstracted in a totally different direction
2022-04-21 18:06:15 +0200 <abastro[m]> Oh, from single input?
2022-04-21 18:06:57 +0200eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
2022-04-21 18:06:59 +0200 <abastro[m]> Right.
2022-04-21 18:07:11 +0200 <c_wraith> like, parser combinators for instance
2022-04-21 18:07:24 +0200 <pagnol> alright, that's been an enlightening discussion thank you everybody for your responses
2022-04-21 18:08:10 +0200 <abastro[m]> Actually I don't see the `applySpec` saving much keystrokes
2022-04-21 18:08:46 +0200 <abastro[m]> Could use lambdas and apply parameter to each
2022-04-21 18:08:57 +0200boxscape_(~boxscape_@p4ff0b7be.dip0.t-ipconnect.de) (Quit: Connection closed)
2022-04-21 18:09:05 +0200 <abastro[m]> I could be mistaken though, like perhaps the records are large
2022-04-21 18:10:22 +0200 <c_wraith> well, if you use it consistently, it gives you a kind of reuse.
2022-04-21 18:10:35 +0200 <c_wraith> with how it supports nested records
2022-04-21 18:11:12 +0200carl(~carl@120.244.220.166) (Quit: WeeChat 3.5)
2022-04-21 18:11:34 +0200kenran(~kenran@200116b82be0c90001725bbb0612ecd3.dip.versatel-1u1.de) (Quit: WeeChat info:version)
2022-04-21 18:12:01 +0200 <pagnol> I find it useful in TypeScript because you can define a new type based an existing one and also supply a mapping in a type-safe manner
2022-04-21 18:12:07 +0200vysn(~vysn@user/vysn) (Ping timeout: 240 seconds)
2022-04-21 18:12:12 +0200 <c_wraith> that's what made me think of parser combinators - the way they can be nested simply
2022-04-21 18:12:56 +0200kenran(~kenran@200116b82be0c9005f346492206b34b5.dip.versatel-1u1.de)
2022-04-21 18:13:10 +0200kenran(~kenran@200116b82be0c9005f346492206b34b5.dip.versatel-1u1.de) (Client Quit)
2022-04-21 18:13:23 +0200kenran(~kenran@200116b82be0c9005f346492206b34b5.dip.versatel-1u1.de)
2022-04-21 18:14:44 +0200ubert1(~Thunderbi@2a02:8109:9880:303c:8727:84d3:4f94:88b2) (Remote host closed the connection)
2022-04-21 18:15:01 +0200 <pagnol> I thought conceptually perhaps there is a connection to lenses somewhere
2022-04-21 18:17:30 +0200eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
2022-04-21 18:18:41 +0200 <c_wraith> I thought about that a bit, when I was connecting it up with Traversable, as lenses are sort of a generalization of Traversable. but you quickly get into incredibly ad-hoc things that work like `each' if you try to go that way
2022-04-21 18:19:17 +0200 <c_wraith> > (1, 2) & each +~ 6
2022-04-21 18:19:18 +0200 <lambdabot> (7,8)
2022-04-21 18:19:47 +0200 <c_wraith> handy, but so hard to predict
2022-04-21 18:19:49 +0200coot(~coot@213.134.190.95) (Quit: coot)
2022-04-21 18:20:29 +0200vicfred(~vicfred@user/vicfred) (Quit: Leaving)
2022-04-21 18:23:19 +0200zyklotomic(~ethan@res380d-128-61-87-175.res.gatech.edu) (Ping timeout: 240 seconds)
2022-04-21 18:23:22 +0200geekosaur(~geekosaur@xmonad/geekosaur) (Remote host closed the connection)
2022-04-21 18:24:30 +0200ralu1(~ralu@static.211.245.203.116.clients.your-server.de) (Ping timeout: 276 seconds)
2022-04-21 18:24:42 +0200 <c_wraith> or more directly...
2022-04-21 18:24:44 +0200 <c_wraith> > sequenceOf each ((+2), (*3)) 5
2022-04-21 18:24:46 +0200 <lambdabot> (7,15)
2022-04-21 18:25:02 +0200geekosaur(~geekosaur@xmonad/geekosaur)
2022-04-21 18:25:23 +0200zyklotomic(~ethan@r4-128-61-95-197.res.gatech.edu)
2022-04-21 18:25:41 +0200 <c_wraith> ultimately, anything working like that in Haskell has the restriction that the functions must all have the same output type as well as the same input type
2022-04-21 18:26:26 +0200jinsun__(~jinsun@user/jinsun) ()
2022-04-21 18:27:14 +0200merijn(~merijn@c-001-001-001.client.esciencecenter.eduvpn.nl)
2022-04-21 18:27:55 +0200 <c_wraith> however, I've just realized... you can do a combinator interface without anything special at all
2022-04-21 18:28:38 +0200jinsun(~jinsun@user/jinsun)
2022-04-21 18:29:02 +0200 <c_wraith> > (pure (,) <*> show <*> (* 3)) 2
2022-04-21 18:29:03 +0200 <lambdabot> ("2",6)
2022-04-21 18:29:27 +0200 <c_wraith> the function instance for Applicative does everything already
2022-04-21 18:30:10 +0200 <c_wraith> that's probably the most Haskellish interpretation of the purpose of that function
2022-04-21 18:32:57 +0200 <c_wraith> at least when you look at applying it to records rather than the way TS uses dictionaries
2022-04-21 18:35:23 +0200jakalx(~jakalx@base.jakalx.net) (Error from remote client)
2022-04-21 18:36:11 +0200kuribas(~user@ip-188-118-57-242.reverse.destiny.be) (Remote host closed the connection)
2022-04-21 18:36:30 +0200jakalx(~jakalx@base.jakalx.net)
2022-04-21 18:38:20 +0200bitmapper(uid464869@id-464869.lymington.irccloud.com)
2022-04-21 18:38:54 +0200 <bitmapper> is snap still ok to use or has development been slow for so long that it is no longer up to date
2022-04-21 18:39:45 +0200ccntrq(~Thunderbi@2a01:e34:eccb:b060:b69c:53df:cf2c:87d1) (Remote host closed the connection)
2022-04-21 18:41:56 +0200heichro(~user@p5495e117.dip0.t-ipconnect.de)
2022-04-21 18:43:30 +0200eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
2022-04-21 18:43:49 +0200 <hololeap> bitmapper: I haven't done any extensive testing with it, but we still package it for gentoo-haskell by loosening a bunch of upper bounds of dependencies in the cabal file
2022-04-21 18:43:55 +0200 <hololeap> https://github.com/gentoo-haskell/gentoo-haskell/blob/master/dev-haskell/snap/snap-1.1.3.1-r5.ebui…
2022-04-21 18:44:44 +0200 <bitmapper> it's just i really don't like Yesod and would greatly prefer to use Snap
2022-04-21 18:45:40 +0200tromp(~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-04-21 18:46:22 +0200 <hololeap> anyway it compiles with ghc-9.0.2 and aeson-1.5.6.0 if you just edit the cabal file a bit
2022-04-21 18:52:08 +0200econo(uid147250@user/econo)
2022-04-21 18:52:48 +0200 <bitmapper> it's pretty annoying needing to use GHC 9.2.2
2022-04-21 18:53:15 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net) (Remote host closed the connection)
2022-04-21 18:54:12 +0200deadmarshal_(~deadmarsh@95.38.229.55)
2022-04-21 18:56:44 +0200 <janus> bitmapper: if you annoy mightybite on discord he seems to respond
2022-04-21 18:57:04 +0200 <janus> bitmapper: i just had the a text-2 revision updated for snap-core like that
2022-04-21 18:57:31 +0200 <janus> my strategy is to annoy no more than once every month, so i'd recommend making a schedule such that you don't forget to annoy him when it seems socially acceptable
2022-04-21 18:58:04 +0200 <janus> *mightybyte
2022-04-21 18:58:29 +0200ralu1(~ralu@static.211.245.203.116.clients.your-server.de)
2022-04-21 18:58:57 +0200deadmarshal_(~deadmarsh@95.38.229.55) (Ping timeout: 276 seconds)
2022-04-21 18:59:08 +0200 <janus> i also really deemphasize the urgency of it every time, to make it seem like i am a super cool relaxed person that doesn't really care about version bounds
2022-04-21 19:00:39 +0200MajorBiscuit(~MajorBisc@c-001-009-046.client.tudelft.eduvpn.nl) (Quit: WeeChat 3.4)
2022-04-21 19:01:37 +0200merijn(~merijn@c-001-001-001.client.esciencecenter.eduvpn.nl) (Ping timeout: 260 seconds)
2022-04-21 19:12:04 +0200thaumavorio(~thaumavor@thaumavor.io) (Quit: ZNC 1.8.2 - https://znc.in)
2022-04-21 19:12:54 +0200thaumavorio(~thaumavor@thaumavor.io)
2022-04-21 19:12:58 +0200 <janus> > [1 | True]
2022-04-21 19:12:59 +0200 <lambdabot> [1]
2022-04-21 19:13:04 +0200 <janus> > [1 | False]
2022-04-21 19:13:06 +0200 <lambdabot> []
2022-04-21 19:13:11 +0200 <janus> never saw this syntax before :O
2022-04-21 19:13:17 +0200qwedfg(~qwedfg@user/qwedfg)
2022-04-21 19:13:45 +0200 <geekosaur> it's just a minimized list comprehension
2022-04-21 19:14:08 +0200 <geekosaur> @undo [ 1 | False ]
2022-04-21 19:14:08 +0200 <lambdabot> if False then [1] else []
2022-04-21 19:14:21 +0200kenran(~kenran@200116b82be0c9005f346492206b34b5.dip.versatel-1u1.de) (Quit: WeeChat info:version)
2022-04-21 19:19:52 +0200 <dminuoso> > [ 1 | otherwise ]
2022-04-21 19:19:55 +0200 <lambdabot> [1]
2022-04-21 19:20:08 +0200 <dminuoso> I can see this being useful for random obfuscation tricks.
2022-04-21 19:20:27 +0200pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Ping timeout: 260 seconds)
2022-04-21 19:20:31 +0200 <dminuoso> singleton x = [ x | otherwise ]
2022-04-21 19:20:36 +0200 <dminuoso> Just put this into your code for good measure.
2022-04-21 19:20:57 +0200 <dminuoso> Keeps your coworkers on their toes.
2022-04-21 19:23:00 +0200dut(~dut@user/dut) (Ping timeout: 276 seconds)
2022-04-21 19:25:26 +0200tzh(~tzh@c-24-21-73-154.hsd1.wa.comcast.net)
2022-04-21 19:31:21 +0200 <opqdonut> dminuoso: lovely
2022-04-21 19:32:38 +0200vicfred(~vicfred@user/vicfred)
2022-04-21 19:32:55 +0200wootehfoot(~wootehfoo@user/wootehfoot)
2022-04-21 19:35:52 +0200 <hololeap> even better if you have MonadComprehensions on
2022-04-21 19:37:57 +0200pagnol(~user@014198154145.ctinets.com) (Ping timeout: 276 seconds)
2022-04-21 19:38:11 +0200 <dminuoso> Okay, now with yahb in the mix, I've created a monster!
2022-04-21 19:38:14 +0200 <dminuoso> % sing = flip (const id) [ x | otherwise ] [ undefined ]
2022-04-21 19:38:14 +0200 <yahb> dminuoso:
2022-04-21 19:38:18 +0200 <dminuoso> % sing
2022-04-21 19:38:19 +0200 <yahb> dminuoso: [[<<Integer>>,<<[Char]>>,<<Char>>]]
2022-04-21 19:38:35 +0200incertia_(~incertia@d47-69-133-171.try.wideopenwest.com)
2022-04-21 19:38:44 +0200 <dminuoso> Spot this one! :)
2022-04-21 19:39:20 +0200 <dminuoso> I should maintain a file with all these cute tricks.
2022-04-21 19:39:24 +0200incertia(~incertia@207.98.163.88) (Ping timeout: 240 seconds)
2022-04-21 19:39:24 +0200incertia_incertia
2022-04-21 19:42:30 +0200tromp(~textual@dhcp-077-249-230-040.chello.nl)
2022-04-21 19:43:32 +0200 <opqdonut> dminuoso: was there a previous definition of x just lying around or is that a useful definition like the lambdabot Expr stuff?
2022-04-21 19:43:34 +0200hololeap(~hololeap@user/hololeap) (Ping timeout: 240 seconds)
2022-04-21 19:43:43 +0200 <dminuoso> The latter. :)
2022-04-21 19:44:01 +0200 <geekosaur> % :t x
2022-04-21 19:44:01 +0200 <yahb> geekosaur: [Dynamic]
2022-04-21 19:44:15 +0200 <opqdonut> % x+1
2022-04-21 19:44:15 +0200 <yahb> opqdonut: ; <interactive>:150:2: error:; * No instance for (Num [Dynamic]) arising from a use of `+'; * In the expression: x + 1; In an equation for `it': it = x + 1
2022-04-21 19:44:49 +0200p_____(~dyeplexer@user/dyeplexer)
2022-04-21 19:44:58 +0200p_____(~dyeplexer@user/dyeplexer) (Remote host closed the connection)
2022-04-21 19:46:31 +0200hololeap(~hololeap@user/hololeap)
2022-04-21 19:47:57 +0200machinedgod(~machinedg@24.105.81.50)
2022-04-21 19:48:22 +0200geekosaur(~geekosaur@xmonad/geekosaur) (Remote host closed the connection)
2022-04-21 19:49:13 +0200neceve(~quassel@2.29.116.221)
2022-04-21 19:50:10 +0200geekosaur(~geekosaur@xmonad/geekosaur)
2022-04-21 19:56:20 +0200aman(~aman@user/aman)
2022-04-21 20:01:00 +0200stackdroid18(14094@user/stackdroid)
2022-04-21 20:03:11 +0200jakalx(~jakalx@base.jakalx.net) ()
2022-04-21 20:03:18 +0200redb(~nmh@136.49.49.211) (Ping timeout: 276 seconds)
2022-04-21 20:04:00 +0200tromp(~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-04-21 20:04:59 +0200tromp(~textual@dhcp-077-249-230-040.chello.nl)
2022-04-21 20:05:34 +0200hololeap(~hololeap@user/hololeap) (Ping timeout: 240 seconds)
2022-04-21 20:05:52 +0200`2jt(~jtomas@175.red-83-36-129.dynamicip.rima-tde.net)
2022-04-21 20:05:52 +0200tromp(~textual@dhcp-077-249-230-040.chello.nl) (Client Quit)
2022-04-21 20:06:55 +0200mikoto-chan(~mikoto-ch@213.177.151.239) (Quit: mikoto-chan)
2022-04-21 20:07:44 +0200tromp(~textual@dhcp-077-249-230-040.chello.nl)
2022-04-21 20:08:59 +0200hololeap(~hololeap@user/hololeap)
2022-04-21 20:09:30 +0200jakalx(~jakalx@base.jakalx.net)
2022-04-21 20:09:57 +0200acidjnk(~acidjnk@p200300d0c722df612442a13791a64f70.dip0.t-ipconnect.de)
2022-04-21 20:13:12 +0200ec(~ec@gateway/tor-sasl/ec) (Quit: ec)
2022-04-21 20:16:40 +0200akegalj(~akegalj@141-136-168-234.dsl.iskon.hr) (Quit: leaving)
2022-04-21 20:17:04 +0200littlebobeep(~alMalsamo@gateway/tor-sasl/almalsamo) (Ping timeout: 240 seconds)
2022-04-21 20:18:04 +0200hololeap(~hololeap@user/hololeap) (Ping timeout: 240 seconds)
2022-04-21 20:19:40 +0200tromp(~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-04-21 20:19:57 +0200mikoto-chan(~mikoto-ch@213.177.151.239)
2022-04-21 20:20:08 +0200CiaoSen(~Jura@p200300c95732ec002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 248 seconds)
2022-04-21 20:22:40 +0200hololeap(~hololeap@user/hololeap)
2022-04-21 20:23:02 +0200tromp(~textual@77.249.230.40)
2022-04-21 20:24:50 +0200eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
2022-04-21 20:25:08 +0200aman(~aman@user/aman) (Quit: aman)
2022-04-21 20:25:57 +0200`2jt(~jtomas@175.red-83-36-129.dynamicip.rima-tde.net) (Remote host closed the connection)
2022-04-21 20:25:58 +0200dyeplexer(~dyeplexer@user/dyeplexer) (Remote host closed the connection)
2022-04-21 20:26:35 +0200redb(~nmh@136.49.49.211)
2022-04-21 20:29:38 +0200coot(~coot@213.134.190.95)
2022-04-21 20:31:15 +0200redb(~nmh@136.49.49.211) (Ping timeout: 276 seconds)
2022-04-21 20:32:24 +0200redb(~nmh@136.49.49.211)
2022-04-21 20:32:28 +0200xkuru(~xkuru@user/xkuru)
2022-04-21 20:33:50 +0200jerry99(~330f3999@cerf.good1.com)
2022-04-21 20:34:04 +0200hololeap(~hololeap@user/hololeap) (Ping timeout: 240 seconds)
2022-04-21 20:37:05 +0200waleee(~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340)
2022-04-21 20:37:12 +0200hololeap(~hololeap@user/hololeap)
2022-04-21 20:39:37 +0200aman(~aman@user/aman)
2022-04-21 20:45:16 +0200redb(~nmh@136.49.49.211) (Ping timeout: 246 seconds)
2022-04-21 20:46:07 +0200eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
2022-04-21 20:48:23 +0200 <Hecate> dminuoso: you messed up powerdns' description markup :)
2022-04-21 20:50:08 +0200 <dminuoso> huh what?
2022-04-21 20:50:53 +0200 <Hecate> https://hackage.haskell.org/package/powerdns-0.4.1
2022-04-21 20:50:55 +0200 <dminuoso> Mmm. This is surprising, I guess something changed between cabal 1.10 and 3.0
2022-04-21 20:50:57 +0200 <dminuoso> This is curious
2022-04-21 20:51:09 +0200 <Hecate> dminuoso: you mean, between three major, breaking releases?
2022-04-21 20:51:15 +0200 <Hecate> yeah something's bound to change :-P
2022-04-21 20:52:54 +0200aman(~aman@user/aman) (Quit: aman)
2022-04-21 20:52:58 +0200jhagborg(~jhagborg@068-187-237-099.res.spectrum.com)
2022-04-21 20:54:24 +0200 <dminuoso> Hecate: This is one is curious. I dont quite understand why this would be the case.
2022-04-21 20:54:49 +0200mrosenbe(~mrosenbe@4.7.173.100) (Remote host closed the connection)
2022-04-21 20:55:29 +0200redb(~nmh@136.49.49.211)
2022-04-21 20:55:48 +0200bahamas(~lucian@93.122.251.130)
2022-04-21 20:56:24 +0200 <dminuoso> Let me run haddock on this locally
2022-04-21 20:58:28 +0200 <dminuoso> Could this possibly be a haddock bug?
2022-04-21 20:59:21 +0200 <dminuoso> The description field hasnt changed, its freeform. It's haddock that interprets this as markup, but apparently not for when the cabal-version is 3.0
2022-04-21 20:59:59 +0200redb(~nmh@136.49.49.211) (Ping timeout: 240 seconds)
2022-04-21 21:04:10 +0200dhouthoo(~dhouthoo@178-117-36-167.access.telenet.be) (Quit: WeeChat 3.5)
2022-04-21 21:05:49 +0200eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
2022-04-21 21:12:44 +0200jgeerds(~jgeerds@d53604b0.access.ecotel.net)
2022-04-21 21:12:51 +0200jmdaemon(~jmdaemon@user/jmdaemon)
2022-04-21 21:19:00 +0200redb(~nmh@136.49.49.211)
2022-04-21 21:23:54 +0200redb(~nmh@136.49.49.211) (Ping timeout: 276 seconds)
2022-04-21 21:24:30 +0200redb(~nmh@136.49.49.211)
2022-04-21 21:27:42 +0200Guest27(~Guest27@2601:281:d47f:1590:768c:7129:aa80:96d9)
2022-04-21 21:29:38 +0200redb(~nmh@136.49.49.211) (Ping timeout: 272 seconds)
2022-04-21 21:32:02 +0200bahamas(~lucian@93.122.251.130) (Read error: Connection reset by peer)
2022-04-21 21:32:10 +0200 <dminuoso> Hecate: Im beginning to suspect this could be a cabal-install bug.
2022-04-21 21:32:25 +0200 <dminuoso> Presumably hackage ends up invoking `cabal haddock` right?
2022-04-21 21:34:21 +0200tromp(~textual@77.249.230.40) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-04-21 21:36:20 +0200MajorBiscuit(~MajorBisc@86-88-79-148.fixed.kpn.net)
2022-04-21 21:40:21 +0200stackdroid18(14094@user/stackdroid) (Quit: hasta la vista... tchau!)
2022-04-21 21:40:45 +0200redb(~nmh@136.49.49.211)
2022-04-21 21:40:59 +0200stackdroid18(14094@user/stackdroid)
2022-04-21 21:41:16 +0200eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
2022-04-21 21:45:21 +0200redb(~nmh@136.49.49.211) (Ping timeout: 276 seconds)
2022-04-21 21:48:31 +0200tromp(~textual@dhcp-077-249-230-040.chello.nl)
2022-04-21 21:51:01 +0200tv(~tv@user/tv) (Ping timeout: 240 seconds)
2022-04-21 21:53:38 +0200anomal(~anomal@87.227.196.109)
2022-04-21 21:58:04 +0200jonathanx(~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) (Ping timeout: 246 seconds)
2022-04-21 21:58:25 +0200 <dminuoso> Hecate: Okay I have a testcase now. Im almost entirely convinced this is a cabal-install bug.
2022-04-21 21:58:35 +0200 <dminuoso> Phew!
2022-04-21 21:58:57 +0200_ht(~quassel@231-169-21-31.ftth.glasoperator.nl) (Remote host closed the connection)
2022-04-21 22:00:40 +0200yauhsien(~yauhsien@61-231-27-3.dynamic-ip.hinet.net)
2022-04-21 22:01:00 +0200 <sclv> the description field isn't rendered by cabal-install or by haddock -- its rendered by hackage
2022-04-21 22:01:47 +0200 <dminuoso> Mmm. I think I understand the reason now. In cabal-version 3.0 it was changed that empty lines are preserved and dots get processed as input now.
2022-04-21 22:01:52 +0200 <dminuoso> That screwed up the haddock markdown.
2022-04-21 22:02:43 +0200redb(~nmh@136.49.49.211)
2022-04-21 22:03:49 +0200Tuplanolla(~Tuplanoll@91-159-69-98.elisa-laajakaista.fi)
2022-04-21 22:06:12 +0200 <dminuoso> Hecate: Okay, luckily I can simply use a revision here. Thanks for the headsup and sorry for the noise.
2022-04-21 22:06:15 +0200jerry99(~330f3999@cerf.good1.com) (Quit: CGI:IRC (Ping timeout))
2022-04-21 22:08:17 +0200jhagborg(~jhagborg@068-187-237-099.res.spectrum.com) (Ping timeout: 256 seconds)
2022-04-21 22:08:59 +0200redb(~nmh@136.49.49.211) (Ping timeout: 240 seconds)
2022-04-21 22:10:49 +0200tv(~tv@user/tv)
2022-04-21 22:11:36 +0200heichro(~user@p5495e117.dip0.t-ipconnect.de) (Quit: ERC (IRC client for Emacs 27.2))
2022-04-21 22:19:16 +0200redb(~nmh@136.49.49.211)
2022-04-21 22:21:10 +0200fendor_(~fendor@178.165.175.241.wireless.dyn.drei.com)
2022-04-21 22:22:16 +0200jhagborg(~jhagborg@068-187-237-099.res.spectrum.com)
2022-04-21 22:23:35 +0200fendor(~fendor@178.115.48.2.wireless.dyn.drei.com) (Ping timeout: 256 seconds)
2022-04-21 22:23:37 +0200redb(~nmh@136.49.49.211) (Ping timeout: 246 seconds)
2022-04-21 22:25:23 +0200stackdroid18(14094@user/stackdroid) (Quit: hasta la vista... tchau!)
2022-04-21 22:26:58 +0200redb(~nmh@136.49.49.211)
2022-04-21 22:31:19 +0200redb(~nmh@136.49.49.211) (Ping timeout: 246 seconds)
2022-04-21 22:32:21 +0200off^(~off@50-192-56-193-static.hfc.comcastbusiness.net)
2022-04-21 22:36:19 +0200neurocyte8614492(~neurocyte@IP-046243080005.dynamic.medianet-world.de)
2022-04-21 22:36:19 +0200neurocyte8614492(~neurocyte@IP-046243080005.dynamic.medianet-world.de) (Changing host)
2022-04-21 22:36:19 +0200neurocyte8614492(~neurocyte@user/neurocyte)
2022-04-21 22:36:55 +0200slack1256(~slack1256@191.126.99.203) (Ping timeout: 246 seconds)
2022-04-21 22:40:50 +0200redb(~nmh@136.49.49.211)
2022-04-21 22:40:56 +0200Guest91(~Guest91@caliga.eecs.tufts.edu)
2022-04-21 22:41:11 +0200cross_(~cross@spitfire.i.gajendra.net) (Remote host closed the connection)
2022-04-21 22:41:14 +0200 <Guest91> Guest91: Well, I've managed to get 8.6.5 to build for me.  Took some doing, and two separate edits to the same part of a single conf.py file to fix two different problems with it.  I'll see if that set of bugs persists into 9.2.2 before reporting it.  (Problems are both with LaTeX config in a .py file.  Python's Unicode handling hates the
2022-04-21 22:41:15 +0200 <Guest91> single \ that LaTeX uses, but changing those to \\ seems to fix it.  And LaTeX bugs out on the font specifications in the same config having spaces in them.)
2022-04-21 22:44:58 +0200redb(~nmh@136.49.49.211) (Ping timeout: 246 seconds)
2022-04-21 22:46:35 +0200 <EvanR> are you sure you're in the right room
2022-04-21 22:46:57 +0200deadmarshal_(~deadmarsh@95.38.229.55)
2022-04-21 22:48:08 +0200 <Guest91> For Haskell 8.6.5?  Yup.  Got some help here yesterday for a custom central build of GHC and several Haskell packages, figured I'd report back on progress in case anyone cared.
2022-04-21 22:48:33 +0200 <Guest91> Step 1, still in progress, getting 9.2.2 built when all I have to work with initially is 8.2.2.
2022-04-21 22:48:50 +0200littlebobeep(~alMalsamo@gateway/tor-sasl/almalsamo)
2022-04-21 22:49:17 +0200 <EvanR> oh ok
2022-04-21 22:49:54 +0200 <Guest91> I was surprised to see .py files in the GHC source tree, but there they were.
2022-04-21 22:50:07 +0200 <Rembane> Python 2 or 3?
2022-04-21 22:51:03 +0200 <EvanR> build system stone soup
2022-04-21 22:51:14 +0200 <Guest91> Dunno!  They're conf.py files without a shebang at the top.  Let me see what the configurator found.
2022-04-21 22:51:48 +0200 <geekosaur> the test environment is in python
2022-04-21 22:52:01 +0200 <geekosaur> s/environment/harness/
2022-04-21 22:52:08 +0200 <Guest91> Configurator log doesn't say.  Given that, it's probably using the first thing that answers 'python' in my PATH, which is Python 3.
2022-04-21 22:52:10 +0200 <geekosaur> dunno about anything else
2022-04-21 22:52:18 +0200 <Rembane> Guest91: Sounds good.
2022-04-21 22:52:39 +0200neceve(~quassel@2.29.116.221) (Ping timeout: 240 seconds)
2022-04-21 22:52:40 +0200 <Rembane> I guess Python is nicer to build a test harness in than bash
2022-04-21 22:53:29 +0200 <Guest91> geekosaur: this particular conf.py file looks to be part of the documentation build.
2022-04-21 22:56:13 +0200redb(~nmh@136.49.49.211)
2022-04-21 22:57:40 +0200geekosaur(~geekosaur@xmonad/geekosaur) (Killed (NickServ (GHOST command used by allbery_b)))
2022-04-21 22:57:40 +0200allbery_b(~geekosaur@xmonad/geekosaur)
2022-04-21 22:57:43 +0200allbery_bgeekosaur
2022-04-21 22:57:55 +0200 <monochrom> If you go back 10 years, you would find a perl script, too. >:)
2022-04-21 22:58:07 +0200 <Guest91> I can go look in the tarballs I have stashed away!
2022-04-21 22:58:11 +0200 <geekosaur> I gather it's still there, for LLVM
2022-04-21 22:58:15 +0200 <Guest91> I may even have one that old.
2022-04-21 22:58:17 +0200 <monochrom> Oh haha
2022-04-21 22:59:28 +0200Guest27(~Guest27@2601:281:d47f:1590:768c:7129:aa80:96d9) (Quit: Client closed)
2022-04-21 23:00:20 +0200 <Guest91> Hm, nope.  I do have an elderly Haskell Platform build from 2011 -- for RHEL 5 -- but apparently wasn't saving tarballs at the time.  Probably should just delete that; we have no RHEL 5 hosts left.
2022-04-21 23:02:42 +0200MajorBiscuit(~MajorBisc@86-88-79-148.fixed.kpn.net) (Ping timeout: 276 seconds)
2022-04-21 23:04:38 +0200redb(~nmh@136.49.49.211) (Ping timeout: 272 seconds)
2022-04-21 23:05:28 +0200zer0bitz(~zer0bitz@2001:2003:f444:8f00:7182:b1bf:175f:4221) (Ping timeout: 248 seconds)
2022-04-21 23:06:33 +0200redb(~nmh@136.49.49.211)
2022-04-21 23:06:59 +0200jhagborg(~jhagborg@068-187-237-099.res.spectrum.com) (Ping timeout: 240 seconds)
2022-04-21 23:07:59 +0200jao(~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net)
2022-04-21 23:08:09 +0200wootehfoot(~wootehfoo@user/wootehfoot) (Quit: Leaving)
2022-04-21 23:08:21 +0200cheategg(~Username@user/cheater) (Ping timeout: 256 seconds)
2022-04-21 23:08:50 +0200 <geekosaur> imagine being able to remove old platforms
2022-04-21 23:09:28 +0200 <Rembane> In a few thousand years it should be possible.
2022-04-21 23:09:31 +0200 <geekosaur> I couldn't even remove the pmax_ul4 stuff in 2010, when we'd desupported them in 2000 because the y2k patch didn't come out until late
2022-04-21 23:10:14 +0200 <Guest91> Hah.  I'm not as confident as I'd like to be that nobody's using this, so I'll have to dig to make sure.  But at a guess, nobody wants Haskell Platform 2011.2.0.1 for anything anymore.
2022-04-21 23:10:19 +0200 <geekosaur> at least I didn't have to try to build stuff for them any more
2022-04-21 23:10:46 +0200 <EvanR> if you remove enough platforms is it really the original ship of ghthecius
2022-04-21 23:10:52 +0200redb(~nmh@136.49.49.211) (Ping timeout: 246 seconds)
2022-04-21 23:11:21 +0200 <EvanR> I don't envy the job of software archeologist
2022-04-21 23:12:23 +0200tromp(~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
2022-04-21 23:12:35 +0200geekosauris *almost* tempted to install AFS just to poke and see if pmax support is *still* in the depot tree
2022-04-21 23:12:44 +0200zeenk(~zeenk@2a02:2f04:a313:d600:8d26:ec9f:3ff6:fc94)
2022-04-21 23:13:00 +0200cosimone`(~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20) (Remote host closed the connection)
2022-04-21 23:13:04 +0200 <Guest91> If you do, make sure to have a good bottle of scotch to hand.
2022-04-21 23:13:12 +0200 <Guest91> You'll probably need it.
2022-04-21 23:13:15 +0200pretty_dumm_guy(trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
2022-04-21 23:13:32 +0200redb(~nmh@136.49.49.211)
2022-04-21 23:15:12 +0200chele(~chele@user/chele) (Remote host closed the connection)
2022-04-21 23:16:00 +0200fendor_(~fendor@178.165.175.241.wireless.dyn.drei.com) (Remote host closed the connection)
2022-04-21 23:16:08 +0200aman(~aman@user/aman)
2022-04-21 23:17:49 +0200cheategg(~Username@user/cheater)
2022-04-21 23:17:52 +0200redb(~nmh@136.49.49.211) (Ping timeout: 246 seconds)
2022-04-21 23:19:02 +0200redb(~nmh@136.49.49.211)
2022-04-21 23:22:03 +0200takuan(~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
2022-04-21 23:26:04 +0200hololeap(~hololeap@user/hololeap) (Ping timeout: 240 seconds)
2022-04-21 23:26:08 +0200aman(~aman@user/aman) (Quit: aman)
2022-04-21 23:26:53 +0200abrantesasf(~abrantesa@177.79.126.131)
2022-04-21 23:27:40 +0200redb(~nmh@136.49.49.211) (Ping timeout: 246 seconds)
2022-04-21 23:28:45 +0200boxscape_(~boxscape_@p4ff0b7be.dip0.t-ipconnect.de)
2022-04-21 23:29:04 +0200abrantesasf(~abrantesa@177.79.126.131) (Remote host closed the connection)
2022-04-21 23:29:36 +0200sammelweis(~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10) (Remote host closed the connection)
2022-04-21 23:30:23 +0200hololeap(~hololeap@user/hololeap)
2022-04-21 23:30:42 +0200sammelweis(~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10)
2022-04-21 23:31:01 +0200abrantesasf(~abrantesa@177.79.126.131)
2022-04-21 23:31:17 +0200abrantesasf(~abrantesa@177.79.126.131) (Remote host closed the connection)
2022-04-21 23:32:57 +0200redb(~nmh@136.49.49.211)
2022-04-21 23:33:58 +0200jao(~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net) (Ping timeout: 246 seconds)
2022-04-21 23:35:18 +0200tvandinther(~tvandinth@2406:e002:6815:1801:eda7:b44d:2b93:da27)
2022-04-21 23:36:01 +0200jao(~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net)
2022-04-21 23:37:13 +0200 <tvandinther> Hi again. I recently got started with Haskell and I'm using VS Code with the language server installed through ghcup. I just started using modules and now the language server doesn't work with the project anymore. It also comes up with an error when I restart the language server: "Multi Cradle: No prefixes matched" I am not sure what the easiest
2022-04-21 23:37:14 +0200 <tvandinther> solution is and why this happens. Appreciate any pointers :)
2022-04-21 23:37:48 +0200redb(~nmh@136.49.49.211) (Ping timeout: 276 seconds)
2022-04-21 23:40:16 +0200Midjak(~Midjak@82.66.147.146) (Quit: This computer has gone to sleep)
2022-04-21 23:41:47 +0200Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer)
2022-04-21 23:42:58 +0200Vajb(~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi)
2022-04-21 23:43:13 +0200 <sm> #haskell-language-server:libera.chat knows most tvandinther
2022-04-21 23:43:47 +0200 <boxscape_> (that's #haskell-language-server if you're not using matrix)
2022-04-21 23:44:11 +0200 <sm> thanks
2022-04-21 23:46:40 +0200tvandinther(~tvandinth@2406:e002:6815:1801:eda7:b44d:2b93:da27) (Quit: Client closed)
2022-04-21 23:46:55 +0200tvandinther(~tvandinth@2406:e002:6815:1801:eda7:b44d:2b93:da27)
2022-04-21 23:47:00 +0200 <tvandinther> thanks
2022-04-21 23:47:58 +0200deadmarshal_(~deadmarsh@95.38.229.55) (Ping timeout: 246 seconds)
2022-04-21 23:48:59 +0200redb(~nmh@136.49.49.211)
2022-04-21 23:52:59 +0200redb(~nmh@136.49.49.211) (Ping timeout: 240 seconds)
2022-04-21 23:53:41 +0200joo-_(~joo-_@fsf/member/joo--) (Ping timeout: 256 seconds)
2022-04-21 23:53:43 +0200coot(~coot@213.134.190.95) (Quit: coot)
2022-04-21 23:54:17 +0200califax(~califax@user/califx) (Remote host closed the connection)
2022-04-21 23:54:36 +0200califax(~califax@user/califx)
2022-04-21 23:55:05 +0200zeenk(~zeenk@2a02:2f04:a313:d600:8d26:ec9f:3ff6:fc94) (Quit: Konversation terminated!)
2022-04-21 23:55:18 +0200joo-_(~joo-_@87-49-147-113-mobile.dk.customer.tdc.net)
2022-04-21 23:55:19 +0200joo-_(~joo-_@87-49-147-113-mobile.dk.customer.tdc.net) (Changing host)
2022-04-21 23:55:19 +0200joo-_(~joo-_@fsf/member/joo--)
2022-04-21 23:58:28 +0200eggplantade(~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
2022-04-21 23:59:30 +0200boxscape_(~boxscape_@p4ff0b7be.dip0.t-ipconnect.de) (Quit: Connection closed)
2022-04-21 23:59:32 +0200DNH(~DNH@2a02:8109:b740:2c4:11d5:718e:c7c6:4a90) (Quit: Textual IRC Client: www.textualapp.com)