Home liberachat/#haskell: Logs Calendar

Logs on 2021-12-07 (liberachat/#haskell)

00:01:59 <dsal> The return includes the number of turns and the score. I could get rid of that, but the both case is actually a bit different.
00:03:09 <dsal> though I'm using parMap, so I do make a list anyway. but parMap sped things up noticeably for me.
00:06:12 <dsal> That's not actually faster, but it's a neat way to think about it, because now it can return the first, the smallest, the last, the largest, or a complete list. Or whatever other monoid you might come up with. The highest score. The first one that has a score lower than the previous…
00:06:53 wroathe joins (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net)
00:06:53 × wroathe quits (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net) (Changing host)
00:06:53 wroathe joins (~wroathe@user/wroathe)
00:13:11 <senoraraton> So now how do I install/include libraries?
00:13:34 <senoraraton> I ran ghc-pkg check and ended up with a LOT of missing files.
00:14:23 fizbin joins (~fizbin@c-73-33-197-160.hsd1.nj.comcast.net)
00:16:00 <sm> senoraraton: sounds like you deleted some files from there, or ran out of disk space ?
00:16:04 <senoraraton> If I try cabal install -p ncurses it tries to build alex and happy, and fails
00:16:18 <senoraraton> I never deleted anything. I have lots of file space.
00:16:37 <sm> why do you say ended up with a lot of missing files ?
00:17:54 <senoraraton> It prints out a list of 100+ that are all similiar to:
00:18:10 <senoraraton> Warning: haddock-html: /usr/share/doc/haskell-annotated-wl-pprint/html doesn't exist or isn't a directory
00:18:42 <sm> ah, I think those can be (must be) ignored
00:18:45 <sm> and how does building alex and happy fail ? I found I had to install happy from $HOME, not inside a project
00:18:57 × fizbin quits (~fizbin@c-73-33-197-160.hsd1.nj.comcast.net) (Ping timeout: 252 seconds)
00:19:35 <senoraraton> !psate
00:19:37 <senoraraton> !paste
00:20:53 <dsal> senoraraton: Generally, you want to make a project with cabal or stack and don't "install" libraries.
00:21:04 <senoraraton> Sure, cabal install -p ncurses fails.
00:21:19 <senoraraton> I'm trying to save the output for context.
00:21:45 <dsal> I don't use cabal, so I don't know what 'cabal install' does. It may not be what you want.
00:21:59 <senoraraton> It is supposed to fetch dependencies, and install the package.
00:22:04 × bontaq quits (~user@ool-45779fe5.dyn.optonline.net) (Remote host closed the connection)
00:22:05 <senoraraton> The dependencie build fails.
00:22:08 <Axman6> @where paste
00:22:08 <lambdabot> Help us help you: please paste full code, input and/or output at e.g. https://paste.tomsmeding.com
00:23:50 <senoraraton> https://controlc.com/1df340e3
00:24:16 <senoraraton> This is the error. Sorry for the atrocious pastebin, I don't know of a better one.
00:25:37 <dsal> "install the packages" sounds like a bad idea, though. I don't ever want to do that when I'm building a haskell project.
00:26:08 <senoraraton> https://paste.tomsmeding.com/tbsyq9R9
00:26:13 <senoraraton> There is a better link to the paste.
00:26:42 <senoraraton> I need to be able to use the libraries, which implies the libraries are "installed"
00:27:04 <dsal> I use libraries, but I do not install libraries.
00:27:14 <senoraraton> So then how do you import the said libraries?
00:27:23 <geekosaur> with modern stack or cabal you do not install libraries, you declare dependencies on them and stack or cabal will install them as needed without lewtting different versions interfere with each other
00:27:55 × burnsidesLlama quits (~burnsides@dhcp168-017.wadham.ox.ac.uk) (Remote host closed the connection)
00:28:12 <senoraraton> Sure. How.
00:28:26 <geekosaur> you use stack/cabal projects to do this. a project is defined by a stack.yaml for stack or a cabal.project for cabal. dependencies are listed in a file foo.cabal for a project named foo
00:28:28 burnsidesLlama joins (~burnsides@client-8-78.eduroam.oxuni.org.uk)
00:28:45 <kennyd> with stack each project has its own sandbox, with local copies of libraries
00:28:55 <dsal> stack usually gives you an hpack package.yaml with a dependencies section.
00:29:02 <dsal> cabal also has a dependencies section, but I don't use it directly.
00:29:03 <geekosaur> if you want to then import them into a ghc session, instead of running ghci directly you use stack ghci or cabal repl
00:29:19 <kennyd> (well not copies, IIRC libraries are shared between projects. but multiple versions of same libraries can coexist)
00:29:21 <senoraraton> I want to compile the binary with the dependencies.
00:29:44 <dsal> Right, so you list them as dependencies in your project.
00:29:48 <sm> senoraraton: `There are files missing in the ‘base-4.15.0.0’ package` is never a good sign, it means something went wrong in the past and you should probably just reinstall ghc
00:29:52 <dsal> How did you start your project?
00:30:01 <dsal> And how did you get ghc/cabal?
00:30:11 <geekosaur> also what platform are you on?
00:30:12 Techcable joins (~Techcable@168.235.93.147)
00:30:39 <geekosaur> (you will have lots of missing files on arch linux because of the way they butcher their haskell packaging)
00:30:45 <senoraraton> I'm so confused. There is all this noise about semantics and what is and isn't "installation".
00:30:48 <senoraraton> I'm on linux
00:31:00 <geekosaur> we need more than "linux"
00:31:06 × pfurla quits (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14) (Quit: gone to sleep. ZZZzzz…)
00:31:06 <senoraraton> GNU linux
00:31:09 <dsal> You seem to be trying to learn haskell by throwing stuff into a shell and seeing what happens.
00:31:12 <kennyd> :)
00:31:12 <geekosaur> sigh
00:31:36 <sm> senoraraton: yes it is confusing, sorry about that. Stick to the paste and the missing files issue, and we'll hopefully focus on that
00:31:38 <geekosaur> arch? debian? ubuntu? gentoo? void? …
00:31:41 <dsal> `nix-shell -p stack` works pretty well on my system for getting something set up.
00:32:14 <sm> ha ha it was time to drag nix in ... :)
00:32:53 × burnsidesLlama quits (~burnsides@client-8-78.eduroam.oxuni.org.uk) (Ping timeout: 252 seconds)
00:33:01 <senoraraton> I'm running archlinux.
00:33:21 × Midjak quits (~Midjak@may53-1-78-226-116-92.fbx.proxad.net) (Quit: This computer has gone to sleep)
00:33:23 <dsal> It sounds like you used arch packages to get ghc and cabal, then. Which is known to be unnecessarily difficult.
00:33:26 <senoraraton> I'm using cabal as my build tool, and I'm trying to import NCurses.
00:33:47 <senoraraton> Of course I did, thats how you install packages on Arch.... >..
00:34:11 <dsal> Yes, we've encountered many suffering arch users in here, so we're familiar with the issues.
00:34:23 <senoraraton> Go on...
00:34:36 <dsal> geekosaur described some of the issues above.
00:34:37 <sclv> arch’s packages are broken
00:34:43 <sm> do we have any arch ghc package experts in here ? if not you might be better off asking #arch or the arch haskell wiki page which I've heard is good
00:34:48 <dsal> I don't use arch, so I don't have any of those issues and can't help get past them.
00:34:53 <sclv> they don’t give the full set of built libs
00:35:09 <sm> OR, you can skip arch packages and install ghc another wa
00:35:12 <sclv> because they compile dynamic only
00:35:14 <sm> y
00:35:30 <senoraraton> Okay....
00:36:01 <senoraraton> Do I need to uninstall and build from source haskell? ghc? cabal? ALL of it?
00:36:19 <monochrom> Uninstall arch's haskell packages. Switch to https://www.haskell.org/ghcup/
00:36:20 <yushyin> if you want to write haskell on arch linux use ghcup
00:36:22 <dsal> ghcup might work for you.
00:36:38 <sm> I would install the stack binary and let it install the rest. Others would recommend ghcup. Two good alternatives to the arch packages.
00:36:40 <sclv> ghcup gives you correct binary distribution
00:36:58 <senoraraton> Does ghcup include cabal?
00:37:02 <sclv> arch just deletes half the official distro
00:37:16 <dsal> yeah, ghcup seems to give me stack and cabal
00:37:16 <sclv> ghcup manages installing ghc and cabal both
00:37:26 <monochrom> Don't succumb to the false dichotomy "either from my distro or build from source". There is always a 3rd choice.
00:37:30 <senoraraton> So I need to remove haskell, and GHC, and cabal before installing.
00:37:33 dsal has never actually *used* ghcup
00:37:46 <dsal> Removing the broken installation would probably make things easier.
00:38:00 <geekosaur> ghcup includes both stack anbd cabal
00:38:25 <geekosaur> and hls which is an editor plugin for IDE-loike editing of haskell source
00:42:42 tfeb joins (~tfb@88.98.95.237)
00:43:17 × senoraraton quits (~senorarat@192-195-83-130.static.monkeybrains.net) (Read error: No route to host)
00:43:20 <yin> what are the performance differences between working with Word8 and Word ?
00:43:32 <monochrom> It depends.
00:43:35 <monochrom> Show actual code.
00:43:48 senoraraton joins (~senorarat@192-195-83-130.static.monkeybrains.net)
00:44:37 × deadmarshal quits (~deadmarsh@95.38.114.2) (Ping timeout: 240 seconds)
00:45:28 × tfeb quits (~tfb@88.98.95.237) (Client Quit)
00:46:29 <hpc> yin: what are the performance differences between working with uint8_t and uint64_t? :P
00:47:24 <monochrom> In fact I believe that even with uint8_t vs uint64_t in C, the correct answer is still "It depends. Show actual code."
00:47:40 × ChaiTRex quits (~ChaiTRex@user/chaitrex) (Quit: ChaiTRex)
00:48:17 ChaiTRex joins (~ChaiTRex@user/chaitrex)
00:48:23 <hpc> that's what i was getting at
00:48:58 <unclechu> Hey, can I evaluate a type family in a GHC REPL?
00:49:30 <monochrom> IIRC :kind! helps but maybe not fully.
00:49:37 <monochrom> or s/fully/always/
00:50:18 <unclechu> monochrom thanks, :k! helps in my case
00:53:36 <senoraraton> ghcup is throwin errors that there is no space on my drive... >.>
00:54:10 <monochrom> It installs stuff in your home directory. It's some 1-2GB.
00:55:17 <monochrom> 2GB.
00:55:19 xsarnik1 joins (xsarnik@lounge.fi.muni.cz)
00:55:32 slice joins (~slice@user/slice)
00:55:50 <monochrom> But then first it downloads the tarball. That's an addition 0.2-0.5GB.
00:56:01 xstill-1 joins (xstill@fimu/xstill)
00:56:11 <senoraraton> It also is using my /tmp drive which is mounted as 1.5G, and it wants 5G...
00:56:22 <monochrom> Yeah.
00:56:31 <senoraraton> My data drive has 50G free.
00:56:59 × xsarnik quits (xsarnik@lounge.fi.muni.cz) (Read error: Connection reset by peer)
00:56:59 xsarnik1 is now known as xsarnik
00:57:12 <monochrom> Set the TMPDIR environment variable to help.
00:57:32 × xstill- quits (xstill@fimu/xstill) (Ping timeout: 268 seconds)
00:57:32 xstill-1 is now known as xstill-
01:01:26 <senoraraton> It looks like its building.....
01:01:58 nvmd joins (~nvmd@user/nvmd)
01:04:32 <yushyin> 'Consider freeing up disk space or setting TMPDIR env variable. ...waiting for 10 seconds before continuing anyway, you can still abort...' is part of the warning that ghcup throws
01:05:01 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
01:05:54 × senoraraton quits (~senorarat@192-195-83-130.static.monkeybrains.net) (Quit: Lost terminal)
01:06:35 <monochrom> People no longer read error messages.
01:06:54 <monochrom> They stopped reading docs a decade ago. This is the next step of the evolution.
01:07:44 senoraraton joins (~senorarat@192-195-83-130.static.monkeybrains.net)
01:08:00 <senoraraton> Okay.. so ghcup and cabal are installed, but its not recokginizing gch(i)
01:08:17 <dsal> Guessing you didn't put them in your path.
01:08:47 <yushyin> monochrom: you can repeat yourself here :D
01:10:04 <senoraraton> I did add ghcup and cabal. ghci is in the ghcup directory I believe. I used the TUI of the binary, and then I installed ghcup and it gave me a different interface, so I'm uninstalling/reinstalling GHC through there.
01:10:54 pfurla joins (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14)
01:11:24 <dsal> Yeah, they're all in the ghcup bin directory.
01:14:31 × Morrow quits (~quassel@bzq-110-168-31-106.red.bezeqint.net) (Quit: https://quassel-irc.org - Chat comfortably. Anywhere.)
01:17:05 renzhi joins (~xp@2607:fa49:6500:b100::5cef)
01:17:20 <senoraraton> So the bin dir is in my path, and ghcup runs, but ghc(i) doesn't
01:18:07 <senoraraton> O, they do run. It just isn't symlinked to ghc
01:18:37 <yushyin> try `where ghci' in your shell
01:18:48 <senoraraton> Not found.
01:19:06 <senoraraton> In the bin dir, I can run ghci-8.10
01:19:23 <senoraraton> Its just not symlinked to ghc, as I said. I'm just gonna create the sym link.
01:19:36 <yushyin> echo $PATH
01:20:23 <senoraraton> $HOME/.ghcup/bin is in my path. ghcup works, so it must be in my path....
01:20:43 × myShoggoth quits (~myShoggot@97-120-85-195.ptld.qwest.net) (Ping timeout: 256 seconds)
01:20:59 <yushyin> you should set a ghc default with ghcup tui
01:21:16 <senoraraton> I do not.
01:21:47 <yushyin> but you should, if you want that symlink
01:21:52 <senoraraton> O... You have to set it.
01:22:20 <senoraraton> I had ghc installed, but there is a "set" flag.
01:22:35 <senoraraton> Now that makes sense, because I can change the version if needed.
01:23:03 <senoraraton> Now time to solve the original problem I had. Importing libraries
01:23:17 <dsal> Step one: Start a project.
01:23:25 × jkaye quits (~jkaye@2601:281:8300:7530:1572:52e4:1190:1c22) (Ping timeout: 240 seconds)
01:23:48 <dsal> I use stack. Some people use cabal. In any case, you list your dependencies in the files and they become available at build time.
01:23:58 d34df00d joins (~d34df00d@2600:1700:8c60:3a10::48)
01:24:06 <d34df00d> Hi!
01:24:18 <d34df00d> I have an UArray of Word8's. What's the best way to dump its contents into a file?
01:26:06 <senoraraton> dsal Sure, that sounds simple. the "list your dependencies" part is the hard part.
01:26:44 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
01:28:24 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
01:28:51 <yushyin> senoraraton: https://cabal.readthedocs.io/en/3.6/getting-started.html#adding-dependencies
01:29:13 × nvmd quits (~nvmd@user/nvmd) (Ping timeout: 265 seconds)
01:29:22 × lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection)
01:29:55 nvmd joins (~nvmd@user/nvmd)
01:30:13 × acidjnk_new quits (~acidjnk@p200300d0c7271e6304137ec8947839cf.dip0.t-ipconnect.de) (Ping timeout: 240 seconds)
01:30:29 <senoraraton> I'm reading it now, do I need to declare my dependencies dependencies?
01:30:49 <yushyin> no you don't
01:31:05 <sm> nice doc
01:31:47 <senoraraton> So this is my package: https://hackage.haskell.org/package/ncurses
01:32:07 × mmhat quits (~mmh@55d45587.access.ecotel.net) (Quit: WeeChat 3.3)
01:32:10 <geekosaur> is that the package you are working with, or one you need as a dependency for something else?
01:32:26 <geekosaur> if the latter, you just list it as a dependency and let stack or cabal worry about it
01:33:27 <senoraraton> That is the package I want to import.
01:33:35 <sm> and they will fail to install the right c libs, passing the buck back to you but never mind that :)
01:35:42 <geekosaur> so it's a dependency and not your actual package. your package is the one that does the importing; anything you import from it is a dependency
01:35:43 <senoraraton> Okay so i added ncurses ^>=0.2.16 to my build-dependencies.
01:36:20 <oats> dsal, MONOIDS https://github.com/oatberry/aoc2021-haskell/commit/2bf909dbd7507d68a1fa160b94db0783d3aa640a
01:36:29 <oats> Last and First are nifty
01:36:44 × pretty_dumm_guy quits (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Quit: WeeChat 3.3)
01:36:52 <geekosaur> arch doesn't distinguish between build and run dependencies itself,m and ncurses is needed by the base system, so you should have no problems with C dependencies
01:36:52 <oats> I feel happy with my solution now :)
01:37:18 <senoraraton> It is a dependency, I want to import the library into my code, I first need to "install" or link or whatever semantic statement you wanna make, make the thing avaliable, and I make it avaliable by putting it in the foo.cabal file.
01:37:29 <geekosaur> (this would come up on fedora or debian/ubuntu, where build and run dependencies differ)
01:37:37 <geekosaur> no, you do not need to install it
01:37:48 <senoraraton> I need to make cabal aware of it.
01:37:48 <geekosaur> cabal or stack will do it for you when it sees the dependency
01:38:22 <geekosaur> really, that's all you need to do is declare the dependency and cabal/stack will do the rest for you
01:38:40 <senoraraton> expecting space, "&&", white space, "||", comma or end of input
01:38:40 <senoraraton> 35 | base ^>=4.15.0.0 36 | nCurses ^>=0.2.16
01:38:49 <senoraraton> Apparently its not that easy.
01:39:25 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 256 seconds)
01:39:39 <geekosaur> comma
01:39:59 <geekosaur> put a comma at the end of line 35
01:39:59 jkaye joins (~jkaye@2601:281:8300:7530:da02:a8ec:4a68:7358)
01:40:25 lavaman joins (~lavaman@98.38.249.169)
01:41:16 <geekosaur> there is method to this madness, by the way: if you install packages yourself, you can end up in a situation where different of your packages require different versions — but multiple versions will conflict with each other and won't work. cabal and stack were developed to manage this for you so each project sees only the version it wants instead of running into dependency conflicts
01:41:30 <senoraraton> https://termbin.com/6xx3
01:41:55 <senoraraton> I'm not installing packages myself, never wanted to. Otherwise what is the entire purpose of the build tool....
01:42:13 <senoraraton> I'm trying to configure cabal to do it for me, and I have been doing that since I started asking questions.
01:42:25 <geekosaur> in C this is done by having a developer package which links always to the latest version, which is effectively the only one available. in perl and python there's no good way to deal with this except to make your own private language installation, so there are tools that do that for you
01:43:02 <geekosaur> hm.
01:44:03 <geekosaur> base 4.15.0.0 corresponds to ghc 9.0.1. you probably have 8.10.7 installed from the base version number\
01:44:10 <senoraraton> Why does cabal require 15, when ghcup recommends 4.14.3
01:44:18 <senoraraton> I installed 4.14.3, does that matter?
01:44:19 <geekosaur> base cannot be upgraded, it's wired into the compiler
01:44:43 <geekosaur> you said ^>=4.15.0.0 on line 35. why?
01:44:56 <senoraraton> So then just change the cabal file to match, but that means every program I generate will be wrong for my build environment?
01:45:27 <geekosaur> I don't understand that question
01:45:48 <geekosaur> did you have some specific reason to specify 4.15.0.0?
01:45:52 <senoraraton> That was autogenerated by cabal
01:46:02 <senoraraton> when I ran cabal init
01:46:03 <geekosaur> if not, just change it to match the version that comes with 8.10.7
01:46:14 <geekosaur> huh
01:46:20 <geekosaur> that sounds wrong
01:46:38 <senoraraton> To start a project you type cabal init. It gives you a little questionairre, and sets up the files.
01:46:49 <geekosaur> it implies that you have a ghc 9.0.1 hanging around somewhere and cabal found it and used its versions
01:46:57 <senoraraton> Maybe it was because the previous version of cabal generated it, and I rolled back with ghcup
01:47:02 <senoraraton> I uninstalled it.
01:47:08 <sclv> you may want to pass “init -i” to ask for interactive too
01:47:10 <geekosaur> then you'll want to regenerate it, yes
01:47:33 <geekosaur> also the reason we don't recommend 9.0.1 is that it's known buggy
01:47:43 <geekosaur> 9.2.1 is the fix but it has its own problems :(
01:47:55 <geekosaur> so for now 8.10.7 remains recommended
01:47:56 <dsal> oats: those constraints are intense.
01:48:02 <geekosaur> unless you like to do compiler debugging
01:48:24 <oats> dsal, haha indeed, I let hls deduce them for me
01:48:34 <sm> poor senoraraton.. so many pitfalls in this landscape
01:48:56 <dsal> oats: Ah. You probably just need 'm'
01:49:34 <oats> dsal, I thought so too, but the `fmap` in `findBoard` adds the Functor constraint
01:50:05 <dsal> I'm trying to follow something here. You're doing a bit more than you need to.
01:50:18 <oats> oh?
01:50:35 <dsal> e.g., `monoid . fmap` might be `foldMap monoid` but I just got out of the shower, so the peak of my brain power is down the drain.
01:52:01 <sm> what are the problems with 9.2.1, geekosaur ?
01:52:01 <monochrom> Is that why nerds don't take showers? >:)
01:52:06 <dsal> ha
01:52:22 <dsal> oats: I'm pretty sure you have too many maps and/or concats, but I'm not entirely sure which are superfluous.
01:52:48 <oats> oh, I can reduce `mconcat . map findBoard` to `foldMap findBoard`
01:53:45 <dsal> Well, yes, but you actually want to fold it into the monoid you want.
01:53:57 <dsal> :t mconcat . map
01:53:58 <lambdabot> error:
01:53:58 <lambdabot> • Couldn't match type ‘[a] -> [b]’ with ‘[c]’
01:53:58 <lambdabot> Expected type: (a -> b) -> [c]
01:54:02 <dsal> :t mconcat . map f
01:54:03 <lambdabot> (Monoid c, Show a, FromExpr c) => [a] -> c
01:54:10 <dsal> :t foldMap f
01:54:11 <lambdabot> (Foldable t, Monoid m, Show a, FromExpr m) => t a -> m
01:54:35 <dsal> (show is kind of weird there, but that's that expr thing)
01:55:21 <dsal> But your monoider function should be `t -> m` for some monoid, then it's something like `foldMap (monoider . findBoard)`
01:55:45 × nvmd quits (~nvmd@user/nvmd) (Ping timeout: 252 seconds)
01:57:08 <dsal> Oh, I see findBoard is already doing that (getting out of the diff view makes code easier to read)
01:57:26 <oats> ah yeah, I was confused about what you were trying to "fix" lol
01:57:44 <oats> and I was wrong, it's the `fmap boardScore` that adds the Functor constraint
01:58:53 <dsal> Is the functor `Maybe`? This might be a case where being more concrete makes things a bit clearer.
01:59:33 <oats> `f` is either `Last` or `First`
01:59:41 <senoraraton> https://termbin.com/ezoe So it fails, but we are making progress.
02:00:44 <oats> oh but maybe if I put the `fmap boardScore` before call `monoid`...
02:00:57 <sm> senoraraton: yes, this is a more common error. You may need to install some
02:00:57 <sm> ncurses-dev system package
02:01:23 <senoraraton> How.
02:01:30 <dsal> oats: Yeah, i see. I had a similar problem with wanting to keep the tuple, but eventually extract it. Yours is easier because you probably could just untuple it first.
02:01:42 <dsal> I'm using Min and Max, so I need the tuple.
02:01:54 <oats> HAH
02:01:54 <sm> with your arch package manager. Search the ncurses packages to find the exact name.
02:01:55 <oats> got it
02:03:24 nvmd joins (~nvmd@user/nvmd)
02:03:27 × InternetCitizen quits (~fuzzypixe@eth-west-pareq2-46-193-4-100.wb.wifirst.net) (Ping timeout: 252 seconds)
02:03:50 <senoraraton> o... there is no dev package.
02:04:04 <senoraraton> Its supposed to be bundled within the ncurses package, which is installed.
02:04:21 <dsal> oats: If you flip it, you could probably end up with just `Monoid m` as a constraint, returning `m`
02:04:34 <yushyin> you need to set use-pkgconfig flag for the ncurses dep
02:04:59 <senoraraton> In arch?
02:05:01 <yushyin> or force-narrow-library
02:05:05 <yushyin> no in the cabal config file
02:05:13 <senoraraton> How do I do that?
02:05:28 × machinedgod quits (~machinedg@135-23-192-217.cpe.pppoe.ca) (Ping timeout: 265 seconds)
02:05:28 <geekosaur> sm: the new codegen for Apple M1s has sign extension problems
02:05:38 <geekosaur> shouldn't matter on any other platform
02:06:07 <yushyin> sometimes linux distribution put the header files in ncursesw/ncurses.h and sometimes in ncurses.h the package has flags for this
02:06:15 <sm> thanks.. I installed 9.2.1 on m1 today, let's see if I notice
02:06:31 <senoraraton> ncurses >= 0.2.16 -use-pkgconfig?
02:06:55 × doyougnu quits (~doyougnu@c-73-25-202-122.hsd1.or.comcast.net) (Ping timeout: 265 seconds)
02:07:05 <geekosaur> ncursesw may have gone away since it's deprecated in ncurses 6 (all versions are "w")
02:07:20 <geekosaur> so it may be in ncurses/ncurses.h
02:07:24 <senoraraton> I have ncurses 6.
02:07:31 <sm> worth a try: did you find the arch haskell wiki page ? they might mention this there. Also try the issue tracker for the ncurses packages on hackage (all of them)
02:07:43 <senoraraton> I'm not installing haskell through arch
02:07:48 <senoraraton> Apparently it doesn't work.
02:07:54 <senoraraton> I installed haskell through ghcup
02:08:02 <sm> this happens basically everyone who builds anything curses related in haskell :(
02:08:04 <geekosaur> no, but you got your C ncurses package via arch and this will affect those as well
02:08:16 <senoraraton> So how do I fix it?
02:08:34 × nvmd quits (~nvmd@user/nvmd) (Quit: Later, nerds.)
02:08:54 <oats> dsal, yay check it out https://github.com/oatberry/aoc2021-haskell/commit/4c1dacf65732fc135dad35366bbb4900a3e68ccc
02:09:10 <oats> thanks for the help :)
02:09:48 <senoraraton> How do I tell cabal the correct inlcude path?
02:10:31 <sclv> senoraraton: the cabal help describes many flags including for include and linking
02:10:35 genieliu joins (~genieliu@103.37.140.24)
02:10:48 <sclv> extra lib dirs and extra include dirs
02:11:41 <senoraraton> I don't know, I think this might have broken me.
02:11:58 <senoraraton> Its like I climb one mountain, and their is another mountain ahead of me.
02:12:11 <senoraraton> I'm not interested in climbing toolchain mountain anymore.
02:13:46 <yushyin> if you follow the link from the hackage ncurses page you then you can do it e.g. like this https://cabal.readthedocs.io/en/latest/setup-commands.html#controlling-flag-assignments
02:14:42 × kennyd quits (~bc8165b6@cerf.good1.com) (Quit: CGI:IRC)
02:14:55 <yin> is there a canonical way of doin (toEnum . fromEnum) ?
02:15:13 <senoraraton> So I run cabal build -use-pkgconfig?
02:15:16 kennyd joins (~bc8165b6@cerf.good1.com)
02:15:33 <senoraraton> Unrecongized build option
02:15:37 <geekosaur> sadly, there is little consistency between different linux distributions or even different versions of the same distribution. which is a large part of the problem with arch; they'll break something like this without warning and you get to pick up the pieces
02:15:53 <geekosaur> yin, no
02:16:01 <yin> geekosaur: thanks
02:16:11 <geekosaur> I call it "twiddle" when I need it
02:16:23 <sclv> -fuse-pkgconfig
02:16:37 <sclv> -f says its a package flag
02:16:53 <senoraraton> Where would I put this? constraint: ncurses +force-narrow-library
02:17:31 <yushyin> this is a valid field in cabal.project, i guess
02:18:14 <senoraraton> Nope, both solutions fail.
02:18:17 <senoraraton> Same issue.
02:20:00 × Vajb quits (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer)
02:20:24 <senoraraton> So do I have to build it from source and make the changes myself inorder to specify the proper version of ncurses? Cause I don't wanna do that.
02:20:36 <yushyin> https://cabal.readthedocs.io/en/latest/cabal-project.html?#cfg-flag---constraint seems like the field name is constraints (plural)
02:22:05 <senoraraton> Still fails.
02:22:08 <yushyin> also, you do need pkgconf installed
02:22:13 <dsal> oats: nice
02:22:31 <senoraraton> It is installed.
02:22:33 <yushyin> (pacman -S pkgconf)
02:23:12 <senoraraton> Its installed.
02:23:35 <senoraraton> Neither of those work.
02:24:56 <senoraraton> The include line is wrong, at least for my system, and I don't know how to edit it.
02:25:58 <sm> maybe https://github.com/commercialhaskell/stack/issues/3509 has some clues
02:27:17 × xff0x quits (~xff0x@2001:1a81:5269:5600:97b6:69e2:8ab7:379a) (Ping timeout: 252 seconds)
02:28:47 yauhsien joins (~yauhsien@61-231-32-247.dynamic-ip.hinet.net)
02:28:50 <senoraraton> This is all stack related, so I don't know how to fix it for cabal.
02:29:03 <senoraraton> But it is broken.
02:29:10 xff0x joins (~xff0x@2001:1a81:52ad:7f00:7dec:e953:6848:5983)
02:29:11 <sm> https://bbs.archlinux.org/viewtopic.php?id=255197: "I corrected this by adding `constraint: ncurses +force-narrow-library` to my .cabal/config file, and running cabal clean, configure...etc." I'm just throwing out links, not an arch user.
02:29:35 <senoraraton> Also issue for 3 years, still not fixed FTW
02:29:43 <senoraraton> I added that. Did not work
02:29:51 <senoraraton> I also modified it to be constraints, did not work
02:30:07 <senoraraton> -fuse-pkgconfig also didn't work, and none of those things worked in any combination either
02:30:23 <yushyin> can confirm that it is not working, might be a bug in the haskell package or cabal
02:31:13 <senoraraton> It wants the ncursesw directory, but ncursesw is deprecated anddoens't exist anymore.
02:31:30 <senoraraton> And I don't know how to edit where cabal is looking for the thing to update the script.
02:33:17 <sm> I will add that https://hackage.haskell.org/package/ncurses was last touched in 2017, and probably not the one you should start with
02:33:36 <sm> https://hackage.haskell.org/package/vty is much more used
02:33:55 <dsal> oats: for a good time, return Int
02:33:59 × yauhsien quits (~yauhsien@61-231-32-247.dynamic-ip.hinet.net) (Ping timeout: 265 seconds)
02:34:30 <senoraraton> vty or brick?
02:34:44 <sclv> on that one, if you pass both use-pkgconfig and force-narrow-library then that should avoid depending on ncursesw but yeah, its a very old lib, and probably not in the best shape
02:36:30 <sm> senoraraton: both are excellent, vty is lower level and simpler so why not get that working first
02:40:40 Vajb joins (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi)
02:41:14 <yushyin> senoraraton: it is unfortunate that you started with an outdated package which causes problems :/
02:41:20 <oats> dsal, for a good time? huh
02:41:36 <dsal> oats: do you understand how Data.Coerce works?
02:41:39 <dsal> :t coerce
02:41:40 <lambdabot> error:
02:41:40 <lambdabot> • Variable not in scope: coerce
02:41:40 <lambdabot> • Perhaps you meant ‘coerced’ (imported from Control.Lens)
02:41:47 <dsal> Oh right, Lambdabot wouldn't let that happen
02:41:51 <sm> yushyin, and it's one of those things we always forget to check at the start
02:42:00 <oats> I am not familiar with Data.Coerce
02:42:02 oats peeks
02:42:03 <dsal> % :t coerce
02:42:03 <yahb> dsal: Coercible a b => a -> b
02:42:40 <dsal> If `a` and `b` have the same representation and coercion is allowed (by role) then you can just do that.
02:43:09 <sm> hackage/cabal should have some kind of warning system to steer new folks away from troublesome packages
02:43:17 <yushyin> senoraraton: but good luck in the further process and that everything works out now ;D
02:43:32 <yushyin> sm: so true
02:44:07 <sm> well, I guess that is in part what stackage is
02:44:18 <dsal> oats: this is typically a newtype wrapper thing, where you can take the result out of it without actually doing anything at runtime. e.g., you can coerce an entire list of stuff into a different type with the same representation.
02:44:32 myShoggoth joins (~myShoggot@97-120-85-195.ptld.qwest.net)
02:44:59 <dsal> For example, `sum` is implemented as `sum = getSum #. foldMap' Sum`
02:45:34 <dsal> where (#.) _f = coerce
02:46:38 ub joins (~Thunderbi@p200300ecdf0ba286bd3e231ce6977cbe.dip0.t-ipconnect.de)
02:47:28 <yushyin> sm: that's true of course, but someone new might quickly find out that the package they want is on hackage (and not with stackage), googles how to add hackage packages to stack (extra-deps:) and promptly run into similar problems
02:47:33 <dsal> So if your monioidification function is (a -> m) with just a simple newtype wrapper like First or Last, then coerce can get the value back out without you having to explicitly name the "extraction" function.
02:48:00 × ubert quits (~Thunderbi@p200300ecdf0ba2ca3910be5e8791151b.dip0.t-ipconnect.de) (Ping timeout: 265 seconds)
02:48:00 ub is now known as ubert
02:49:39 <oats> interesting
02:49:44 <oats> this is safe?
02:50:03 InternetCitizen joins (~fuzzypixe@eth-west-pareq2-46-193-4-100.wb.wifirst.net)
02:50:26 <dsal> Yeah.
02:50:34 <dsal> There's also unsafeCoerce. That's less safe.
02:50:49 <sm> yushyin: indeed, but at least they are more likely to find an use something in the stackage snapshot (like vty)
02:52:27 <dsal> In addition to just straight memory representation, there are also roles to limit where you can coerce. For example, if you have a `Map Int Int` you can coerce it to a `Map Int (X Int)` for some newtype X over Int, but you can't coerce it to a `Map (X Int) Int` because that X type can have ordering rules that differ from the underlying Int and that would cause the map to misbehave.
02:53:23 <senoraraton> Well vty builds, I can't find any documentation on how to use it, but cabal imported it.
02:53:33 <senoraraton> Is there a way to supress the "up to date" output from cabal run?
02:53:45 <dsal> Weird. I can't find that in the docs, but in the source, you'll see `type role Map nominal representational` -- you can coerce something whose role is representational, but not nominal.
02:54:05 <senoraraton> I found the docs.
02:54:41 <sm> yes, https://hackage.haskell.org/package/vty-5.33/docs/Graphics-Vty.html
02:55:02 <sm> when you try brick, don't miss the excellent user guide, as I did
02:55:37 <dsal> I don't think I could use brick without that Carnage/Migos song playing the whole time.
02:56:18 <senoraraton> I love how I spent 4 hours solving a problem, to just give up and try a different library.
02:56:32 <dsal> To be fair, you have a variety of problems and you solved many of them.
02:56:37 × InternetCitizen quits (~fuzzypixe@eth-west-pareq2-46-193-4-100.wb.wifirst.net) (Ping timeout: 252 seconds)
02:56:54 <sm> well, and learning valuable arch / haskell package management troubleshooting skills
02:57:25 <oats> dsal, oh and now I also need a Coercible constraint on playBingo, I see
02:57:31 <oats> playBingo :: (Monoid b, Coercible b c) => (Maybe Int -> b) -> Bingo -> c
02:57:34 <sm> number one being: be careful about using packages not touched in the last year
02:57:40 <dsal> oats: Yeah, that's neat.
02:57:43 × mvk quits (~mvk@2607:fea8:5cdd:f000::9788) (Ping timeout: 252 seconds)
02:58:07 <dsal> But you can also just return Int and have `Coercible b Int`
02:58:27 <sm> dsal: https://www.youtube.com/watch?v=dermyeoLDgs ?
02:58:32 oats adds FlexibleContexts
02:58:56 <dsal> sm: My mama says stay patient
02:59:18 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
03:00:43 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
03:02:20 <janus> using stack, what is the motivation for putting version bounds in package.yaml? the versions are already determined by the stack.yaml
03:03:01 <dsal> They translate directly to cabal. You might still have an upper bound. Sometimes I have lower bounds and I have to go outside of package.yaml to do that.
03:03:08 <sm> janus: 1. package.yaml generates the .cabal file, which is a standard required by most tools
03:03:11 <dsal> e.g., I'm using amazonka 2 in some of my stuff.
03:03:39 <dsal> It would be nice of hpack could make reasonable guesses for stackage, though.
03:03:44 <sm> 2. package.yaml/*.cabal describe the range of versions allowed, which is useful and different information than what's in stack.yaml
03:03:47 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Ping timeout: 256 seconds)
03:04:22 <oats> playBingo :: (Monoid b, Coercible b (Maybe Int)) => (Maybe Int -> b) -> Bingo -> Maybe Int
03:04:26 <oats> this is super interesting
03:04:31 <sm> 3. they also define the packages visible to your code, which is a small subset of the stackage snapshot
03:04:32 <oats> this shit is why I do AoC
03:04:43 <dsal> oats: Yeah, neat. :)
03:04:43 × abrantesasf quits (~abrantesa@187.36.170.211) (Remote host closed the connection)
03:04:58 <oats> dsal, I've learned more than a couple things today, thank you
03:05:07 <janus> this project has a hundred deps, we will never be able to put the versions that would theoretically work
03:05:11 <dsal> oats: woo. Great. Hopefully I didn't do any damage.
03:05:29 <janus> i ran cabal-plan on it and the plan that was generated built fine
03:05:48 <sm> janus: you at least need to list their names though, rather than importing random packages from stackage/hackage
03:05:50 <janus> so since there were no bounds, it seemed that no package made a breaking release for 8.6.5 which is the compiler used
03:06:01 <dsal> janus: Its use is proportional to the number of different projects using your package.
03:06:18 × lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection)
03:06:23 <dsal> If you're using amazonka and you don't have an upper bound, you're likely to have a bad time when 2.0 ships. :)
03:07:01 × jkaye quits (~jkaye@2601:281:8300:7530:da02:a8ec:4a68:7358) (Ping timeout: 268 seconds)
03:07:38 <janus> dsal: it won't ever land in lts-14. and even if it did, we'd just make an extra-dep once compilation fails
03:08:01 <janus> this "reactive" way of working that stack encourages is growing on me...
03:08:41 <dsal> janus: Yeah, that's cool. But if you publish your package, it's not published as an lts
03:08:45 <janus> dsal: actually i went on this whole adventure with cabal-plan because i wanted to run amazonka2. so now i have this giant list of extra-deps that replaces bascially every package in the lts...
03:08:57 <dsal> lts-14 is pretty old
03:09:00 <sm> janus: if it suits your needs, you are certainly free to list all deps in stack.yaml and generate package.yaml from it (some will probably have to be comments)
03:09:45 <sm> I could see that being convenient in some use cases
03:09:58 <sm> or, vice versa
03:10:01 <janus> sm: what would be gained by generating package.yaml from stack.yaml? so that it could be published? i gather it is only useful for libraries
03:10:26 <sm> you asked why the two files exist, and suggested that two was unnecessary for you
03:10:40 bitdex joins (~bitdex@gateway/tor-sasl/bitdex)
03:10:48 <janus> aah right, i didn't think about it
03:10:57 <sm> so, perhaps you'd gain more simplicity that you were hoping for
03:11:10 <sm> I have never heard of it done though
03:11:22 <janus> yeah. it sounds nice. but the stack.yaml includes transitive dependencies too. seems a bit weird to list those in package.yaml
03:11:46 <sm> normally stack.yaml is very minimal. A long list of deps there is a sign that you're using libraries not well packaged / with the wrong ghc version
03:12:10 <janus> right, it was minimal before i attempted this... :P
03:12:29 <janus> i could start deleting random stuff from it, but it seems weird, since it would effectively downgrade libraries
03:12:51 <janus> like i saw cabal-plan put happy 1.20 and if i remove it from extra deps, it rebuilds a couple of packages with happy 1.19
03:13:02 <sm> consider trying snapshots of other major ghc versions ? probably one will be easier
03:13:04 <janus> so since i generated it by machine, may as well let it be...
03:13:58 <sm> I made a huge stack.yaml this morning, only because there's no snapshot for ghc 9.2 yet
03:14:41 <janus> sm: with cabal-plan it seems easy either way... but yeah, maybe you're right that i could delete more of the stack.yaml. maybe the version in the snapshot would even be the same as the stack.yaml
03:14:47 <janus> but there is no tooling for me to know, i guess
03:15:02 <sm> there are tricks, but yes tooling could be better
03:15:24 <janus> cabal-plan is already magic for me, i am so excited :D
03:16:00 <sm> I usually try things like stack init --resolver lts-X.Y --dry-run in my project for several recent ghc versions.
03:16:31 <sm> better integration between cabal plan and stack snapshots would be nice
03:18:03 <janus> it definitely wasn't intuitive... i mean, i had to 1. write a cabal.project 2. realize that cabal gen-bounds doesn't read cabal.project 3. use cabal-plan topo and fiddle with its results
03:21:25 <janus> sm: do you ever use "stack init --solver" ? it is undocumented
03:24:42 <sclv> i think they deprecated solver and stopped supporting it
03:25:14 <janus> ok, so i guess cabal-plan is better nowadays
03:25:55 <sm> oh is that still there ? I thought it was removed
03:26:03 × pavonia quits (~user@user/siracusa) (Read error: Connection reset by peer)
03:26:23 mbuf joins (~Shakthi@223.178.74.194)
03:26:41 <janus> it is mentioned on https://docs.haskellstack.org/en/stable/nonstandard_project_init/
03:31:02 × azimut quits (~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection)
03:31:24 azimut joins (~azimut@gateway/tor-sasl/azimut)
03:32:44 × td_ quits (~td@muedsl-82-207-238-027.citykom.de) (Ping timeout: 252 seconds)
03:34:30 deadmarshal joins (~deadmarsh@95.38.118.214)
03:34:41 td_ joins (~td@94.134.91.180)
03:34:49 lavaman joins (~lavaman@98.38.249.169)
03:34:52 × lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection)
03:35:25 lavaman joins (~lavaman@98.38.249.169)
03:35:37 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
03:36:12 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
03:36:12 finn_elija joins (~finn_elij@user/finn-elija/x-0085643)
03:36:12 finn_elija is now known as FinnElija
03:38:59 × deadmarshal quits (~deadmarsh@95.38.118.214) (Ping timeout: 256 seconds)
03:39:49 × lavaman quits (~lavaman@98.38.249.169) (Ping timeout: 240 seconds)
03:40:04 <senoraraton> I can't get any of these sample codes for vty to compile... >.<
03:41:06 <dsal> senoraraton: What are you trying? What errors are you getting?
03:42:29 <senoraraton> https://hackage.haskell.org/package/vty-examples-5.5.0/src/ Missing dependencies that I then added to app.cabal but things are deprecated and it fails
03:42:37 × genieliu quits (~genieliu@103.37.140.24) (Ping timeout: 265 seconds)
03:43:34 pavonia joins (~user@user/siracusa)
03:43:56 <senoraraton> I cloned the repo, it seems to be working better.
03:44:13 × renzhi quits (~xp@2607:fa49:6500:b100::5cef) (Ping timeout: 240 seconds)
03:44:50 × kjak quits (~kjak@pool-108-45-56-21.washdc.fios.verizon.net) (Ping timeout: 252 seconds)
03:47:24 <sm> janus, you mean the `:TODO: Document --solver` ? it's a documentation bug, it's not in current stack
03:51:58 genieliu joins (~genieliu@103.37.140.38)
03:53:35 × slice quits (~slice@user/slice) (Quit: zzz)
03:54:18 <senoraraton> https://termbin.com/u6ci
03:56:10 <EvanR> what's the goto package for doing a 9x9 matrix multiplication
03:58:30 × myShoggoth quits (~myShoggot@97-120-85-195.ptld.qwest.net) (Remote host closed the connection)
03:58:50 myShoggoth joins (~myShoggot@97-120-85-195.ptld.qwest.net)
03:59:29 <dmj`> hmatrix or linear
03:59:40 <dsal> senoraraton: It seems pretty clear. But I can't see the code.
04:01:16 <sm> senoraraton: at https://hackage.haskell.org/package/vty-examples, look at the Uploaded date: 2016. This means you should avoid this package
04:01:25 <dsal> Config doesn't have a Default instance, but it has a Monoid instance.
04:01:58 <sm> I think they are just built in to the main vty package now.
04:02:18 <dsal> If you use a vty of similar vintage to the code you're trying to compile, it might work.
04:03:19 <jle`> phaazon: hope it wasn't too disappointing :D
04:03:29 <dsal> Yeah, the changelog says they removed Default in 5.15.
04:04:02 × biberu quits (~biberu@user/biberu) (Ping timeout: 240 seconds)
04:04:12 <sm> there's a newer vty-examples.cabal in https://github.com/jtdaugherty/vty/tree/master/test . Perhaps that is better
04:05:54 <EvanR> in linear, the relevant function appears to be (!*!) :: (Functor m, Foldable t, Additive t, Additive n, Num a) => m (t a) -> t (n a) -> m (n a)
04:06:29 <EvanR> that 9x9 matrix multiplication is an instance of this, and how to convince ghc of it, will be an interesting diversion
04:07:06 <EvanR> I guess you'd make a V9 type
04:07:23 <glguy> senoraraton: How about: https://github.com/glguy/set-game
04:08:02 <jackdk> EvanR: https://hackage.haskell.org/package/linear-1.21.8/docs/Linear-V.html
04:09:13 × emf quits (~emf@2620:10d:c091:480::1:c2f8) (Ping timeout: 252 seconds)
04:09:21 emf_ joins (~emf@2620:10d:c091:480::1:c2f8)
04:10:09 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 256 seconds)
04:11:16 <sm> glguy: I tested you / haskell. :) Sorry to say, one of your deps fails to build horribly here on mac with ghc 8.10. Am I Doing Something Wrong ? https://termbin.com/t9c5
04:11:22 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
04:12:03 <glguy> That looks like your GHC install is bad
04:12:15 biberu joins (~biberu@user/biberu)
04:12:15 <sm> I just brew installed it today
04:12:20 <glguy> is that arm mac or old mac?
04:12:28 <sm> this is an m1 mac
04:12:48 <glguy> ghcup manages ghc installs, I don't know if homebrew works or not
04:13:18 <glguy> I'll try on my M1
04:13:41 <glguy> Err, I guess I'll try later; wife is using it :)
04:13:54 <sm> (`stack init && stack build` worked though)
04:14:08 <sm> (cool looking game!)
04:14:48 <glguy> Have you played the actual Set card game already?
04:15:28 doyougnu joins (~doyougnu@c-73-25-202-122.hsd1.or.comcast.net)
04:15:30 <sm> never, so I don't know what to do here
04:15:45 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Ping timeout: 256 seconds)
04:15:56 <glguy> OK, the way this works is you're looking for sets of three cards such that each property of the cards is all the same, or all different
04:16:10 <glguy> so there are: color, count, shape, fill-pattern
04:16:28 <glguy> so all three need to be the same of red, green, blue, or one of each
04:16:36 fizbin joins (~fizbin@c-73-33-197-160.hsd1.nj.comcast.net)
04:17:01 <glguy> same for chevron, oval, triangle; hollow, stripped, hashed; 1, 2, 3
04:17:13 <sm> cool. I was trying to match 2.. and when I select 3 I should.. (D)eal ?
04:17:15 <glguy> usually you'd play it in a group and yell out SET! when you see one
04:17:26 <sm> oh it's automatic
04:17:48 <sm> I just really like the colours and semigraphics :)
04:17:50 <dsal> I just built that in a nix-shell
04:17:57 <dsal> Works fine
04:18:34 <glguy> If there are *no sets* you can deal out 3 more cards
04:19:10 × leah2 quits (~leah@vuxu.org) (Ping timeout: 268 seconds)
04:19:49 × myShoggoth quits (~myShoggot@97-120-85-195.ptld.qwest.net) (Ping timeout: 240 seconds)
04:21:01 × fizbin quits (~fizbin@c-73-33-197-160.hsd1.nj.comcast.net) (Ping timeout: 263 seconds)
04:21:14 <jackdk> glguy: set is a mean nerdsnipe to throw into a >=700 person chan ^^
04:21:33 <glguy> I shoud make a set game channel bot :3
04:21:51 <glguy> Just need to figure out a nice compact set of glyphs!
04:22:11 <sm> that's a really weird cabal build failure with blaze-builder. cabal repl works, stack build with same ghc version works..
04:22:12 curiousgay joins (~curiousga@77-120-141-90.kha.volia.net)
04:22:45 <sm> and blaze-builder has zero issues so clearly I'm special
04:23:27 × cjb quits (~cjb@user/cjb) (Quit: rcirc on GNU Emacs 29.0.50)
04:23:39 <EvanR> oh dang did not know about that API thanks jackdk
04:25:28 <glguy> 04▲△◭ 03●○◐ 06■□◧
04:25:42 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Quit: Leaving)
04:27:14 <jackdk> Set!
04:34:30 leah2 joins (~leah@vuxu.org)
04:37:14 × doyougnu quits (~doyougnu@c-73-25-202-122.hsd1.or.comcast.net) (Ping timeout: 265 seconds)
04:38:24 × waleee quits (~waleee@2001:9b0:216:8200:d457:9189:7843:1dbd) (Quit: WeeChat 3.3)
04:39:22 fizbin joins (~fizbin@c-73-33-197-160.hsd1.nj.comcast.net)
04:43:01 × genieliu quits (~genieliu@103.37.140.38) (Ping timeout: 240 seconds)
04:47:42 <dibblego> who's up for a game of set
04:56:33 genieliu joins (~genieliu@103.37.140.24)
04:59:51 × dhruvasagar quits (~dhruvasag@49.207.222.205) (Quit: WeeChat 3.3)
05:03:30 × shriekingnoise quits (~shrieking@186.137.144.80) (Quit: Quit)
05:09:15 × Kaiepi quits (~Kaiepi@156.34.44.192) (Remote host closed the connection)
05:09:37 Kaiepi joins (~Kaiepi@156.34.44.192)
05:09:56 mvk joins (~mvk@2607:fea8:5cdd:f000::9788)
05:17:01 × biberu quits (~biberu@user/biberu) (Ping timeout: 240 seconds)
05:18:30 genieliu_ joins (~genieliu@103.37.140.24)
05:18:53 × emf_ quits (~emf@2620:10d:c091:480::1:c2f8) (Ping timeout: 252 seconds)
05:19:15 slack1256 joins (~slack1256@191.126.99.210)
05:19:17 × genieliu quits (~genieliu@103.37.140.24) (Ping timeout: 256 seconds)
05:23:16 × pfurla quits (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14) (Quit: gone to sleep. ZZZzzz…)
05:24:32 biberu joins (~biberu@user/biberu)
05:25:29 <EvanR> whoa whoa... what is set?
05:25:43 <EvanR> scrolling up
05:26:03 <int-e> EvanR: https://en.wikipedia.org/wiki/Set_(game)
05:26:27 lavaman joins (~lavaman@98.38.249.169)
05:26:53 <int-e> (more context won't help :P)
05:29:54 × VoidNoir0 quits (~VoidNoir0@72.80.203.52) (Quit: Connection closed)
05:30:32 <int-e> Hmm, it would... I didn't look far enough.
05:30:37 × lavaman quits (~lavaman@98.38.249.169) (Ping timeout: 240 seconds)
05:31:12 <int-e> Did glguy's line have colors?
05:31:22 <EvanR> not for me but this is hexchat
05:31:32 <dibblego> did for me, and this is hexchat
05:31:47 <dibblego> https://i.imgur.com/rQLzGP0.png
05:32:05 <EvanR> oof
05:32:35 <int-e> (I filter those because it keeps me saner, but this was one instance where they would be appropriate... though maybe not those colors, exactly)
05:32:36 <EvanR> maybe a version thing
05:32:57 <int-e> EvanR: xchat had a setting for that, I bet hexchat still has it
05:34:20 <Axman6> it has colours in the best client too, glirc
05:34:42 pfurla joins (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14)
05:36:00 <int-e> Axman6: check under [menu] Settings -> Preferences -> [categories] Interface -> Colors -> [tab] Color Stripping -> Messages
05:36:22 <Axman6> eh? I'm saying I do have colours...
05:36:44 <int-e> uh, I'm mixing up nicks again, that was for EvanR
05:36:53 <EvanR> thanks, I totally didn't see that
05:36:54 <Axman6> :thumbsup:
05:38:08 × genieliu_ quits (~genieliu@103.37.140.24) (Ping timeout: 265 seconds)
05:38:55 _ht joins (~quassel@82-169-194-8.biz.kpn.net)
05:38:57 <int-e> Now let's speculate why https://adventofcode.com/2021/leaderboard/self is temporarily disabled. It displays global ranks, but maybe they're not in the database, making their computation a linear time operation?
05:40:36 <EvanR> earlier it was 500ing
05:40:50 <int-e> earlier it worked ;)
05:40:51 <EvanR> private leaderboards seem to be outdated as well
05:40:56 <int-e> oh
05:41:22 <EvanR> ah it updated
05:41:48 <int-e> those may be a thing that's recomputed every 5 seconds and cached
05:42:23 <EvanR> if so it's greater than 5 seconds xD
05:42:41 <EvanR> (but in previous days it seemed responsive, since that's of course first thing I do once "winning" lol)
05:43:07 <EvanR> (see how far down glguy's leaderboard I fell to)
05:43:38 <int-e> (I wonder how many requests per second that website gets... hundreds, thousands, or more?)
05:44:01 <xerox> maybe last year hiccup post sheds some light on that number, I forget
05:44:40 × zebrag quits (~chris@user/zebrag) (Quit: Konversation terminated!)
05:44:51 <int-e> (and of course there'll be a huge spike to handle around 5:00:00 UTC)
05:45:26 deadmarshal joins (~deadmarsh@95.38.118.214)
05:45:41 yauhsien joins (~yauhsien@61-231-32-247.dynamic-ip.hinet.net)
05:48:33 jmorris joins (uid433911@id-433911.hampstead.irccloud.com)
05:49:32 × jmorris quits (uid433911@id-433911.hampstead.irccloud.com) (Client Quit)
05:49:44 <EvanR> aka "ridiculous AM"
05:51:25 × xff0x quits (~xff0x@2001:1a81:52ad:7f00:7dec:e953:6848:5983) (Ping timeout: 240 seconds)
05:52:07 × yauhsien quits (~yauhsien@61-231-32-247.dynamic-ip.hinet.net) (Remote host closed the connection)
05:52:21 xff0x joins (~xff0x@2001:1a81:52ad:7f00:b931:f565:16a0:6381)
05:53:07 yauhsien joins (~yauhsien@61-231-32-247.dynamic-ip.hinet.net)
05:55:21 × slowButPresent quits (~slowButPr@user/slowbutpresent) (Quit: leaving)
05:56:45 <glguy> I don't know what's going on with the leaderboards, but it's neat to see 32 people are keeping up with it so far
06:01:03 × slack1256 quits (~slack1256@191.126.99.210) (Ping timeout: 252 seconds)
06:01:03 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
06:01:14 genieliu joins (~genieliu@103.37.140.38)
06:02:54 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
06:03:49 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 240 seconds)
06:06:12 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
06:09:26 × bitmapper quits (uid464869@id-464869.lymington.irccloud.com) (Quit: Connection closed for inactivity)
06:11:41 × deadmarshal quits (~deadmarsh@95.38.118.214) (Ping timeout: 252 seconds)
06:11:42 takuan joins (~takuan@178-116-218-225.access.telenet.be)
06:14:49 × img quits (~img@user/img) (Quit: ZNC 1.8.2 - https://znc.in)
06:15:03 <EvanR> (anonymous user #815608) is threatening to eat your lunch
06:16:28 × _ht quits (~quassel@82-169-194-8.biz.kpn.net) (Remote host closed the connection)
06:17:50 mjrosenb joins (~mjrosenb@pool-108-54-97-96.nycmny.fios.verizon.net)
06:18:11 img joins (~img@user/img)
06:21:12 wroathe joins (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net)
06:21:12 × wroathe quits (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net) (Changing host)
06:21:12 wroathe joins (~wroathe@user/wroathe)
06:25:25 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 240 seconds)
06:28:37 × xff0x quits (~xff0x@2001:1a81:52ad:7f00:b931:f565:16a0:6381) (Ping timeout: 240 seconds)
06:29:32 xff0x joins (~xff0x@2001:1a81:52ad:7f00:d65b:5d2c:2ffb:2456)
06:30:49 × notzmv quits (~zmv@user/notzmv) (Ping timeout: 265 seconds)
06:32:32 × hololeap quits (~hololeap@user/hololeap) (Remote host closed the connection)
06:33:49 × MidAutumnMoon6 quits (~MidAutumn@user/midautumnmoon) (Ping timeout: 240 seconds)
06:36:22 deadmarshal joins (~deadmarsh@95.38.118.214)
06:36:25 <xerox> what is that trick to do a one-file cabal package that runs as a haskell script and you can also have dependencies?
06:40:13 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 240 seconds)
06:44:41 × shapr quits (~user@pool-100-36-247-68.washdc.fios.verizon.net) (Ping timeout: 252 seconds)
06:45:59 <sm> https://docs.haskellstack.org/en/stable/GUIDE/#script-interpreter , https://cabal.readthedocs.io/en/3.6/cabal-commands.html?highlight=script#cabal-v2-run
06:48:43 michalz joins (~michalz@185.246.204.62)
06:50:38 × senoraraton quits (~senorarat@192-195-83-130.static.monkeybrains.net) (Ping timeout: 265 seconds)
06:51:22 <xerox> sm: appreciate it
06:57:02 emf joins (~emf@2620:10d:c091:480::1:1ebc)
06:58:28 × pfurla quits (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14) (Quit: gone to sleep. ZZZzzz…)
06:58:37 × xff0x quits (~xff0x@2001:1a81:52ad:7f00:d65b:5d2c:2ffb:2456) (Ping timeout: 240 seconds)
06:59:42 xff0x joins (~xff0x@port-92-193-200-89.dynamic.as20676.net)
07:03:30 × yauhsien quits (~yauhsien@61-231-32-247.dynamic-ip.hinet.net) (Remote host closed the connection)
07:04:09 yauhsien joins (~yauhsien@61-231-32-247.dynamic-ip.hinet.net)
07:04:32 <int-e> > unwords $ map (\x -> printf "%.2f" (192-x/14)) [2653,2627,2603,2590,2577,2528,2522,2520,2511,2507] -- average rank so far, top 10
07:04:33 <lambdabot> "2.50 4.36 6.07 7.00 7.93 11.43 11.86 12.00 12.64 12.93"
07:04:50 <int-e> EvanR: ^^ it looks much less close like this
07:06:47 <EvanR> what is this doctoring of the data lol
07:07:27 <dmj`> @pl (\x y -> abs (x - y))
07:07:27 <lambdabot> (abs .) . (-)
07:07:31 <dmj`> oof
07:07:37 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
07:08:31 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
07:08:35 <int-e> EvanR: 191 users, so an average score of 191 would mean average rank 1... 192 - 191 = 1.
07:08:37 × yauhsien quits (~yauhsien@61-231-32-247.dynamic-ip.hinet.net) (Ping timeout: 240 seconds)
07:08:48 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
07:09:41 × emf quits (~emf@2620:10d:c091:480::1:1ebc) (Quit: emf)
07:10:09 emf joins (~emf@2620:10d:c091:480::1:1ebc)
07:10:48 <int-e> EvanR: I think it's illuminating, not doctoring :P
07:11:04 <int-e> dmj`: hah. don't do that then? :-)
07:11:11 <EvanR> the rank for a particular day makes sense
07:11:21 <EvanR> not sure what the default is showing though
07:11:39 <EvanR> average?
07:11:57 <int-e> EvanR: the score is [number of users, currently 191] for rank 1, down to 1 for rank [... 191].
07:12:14 chele joins (~chele@user/chele)
07:12:14 <int-e> EvanR: averaging makes sense because those numbers are simply added together
07:12:16 <EvanR> that's what i mean... the number
07:12:19 <dsal> dmj`: compute inp cost t = sum (cost . abs . subtract t <$> inp)
07:13:22 <EvanR> is average of 1 - x the same as 1 - average of x xD
07:13:39 <int-e> EvanR: yes, averaging commutes with affine maps
07:13:39 × deadmarshal quits (~deadmarsh@95.38.118.214) (Ping timeout: 252 seconds)
07:13:47 <dmj`> int-e: searching for a fancy point-free way to write absolute value after subtraction
07:14:06 <dmj`> :t zipWith (curry (abs . uncurry subtract))
07:14:07 <lambdabot> Num c => [c] -> [c] -> [c]
07:14:46 <EvanR> abs .: subtract ?
07:14:47 <int-e> dmj`: sections of composition are a code smell :P
07:15:09 <EvanR> :t (.) . (.)
07:15:10 <lambdabot> (b -> c) -> (a1 -> a2 -> b) -> a1 -> a2 -> c
07:15:19 <EvanR> :t abs (.) . (.) subtract
07:15:20 <lambdabot> (Num a1, Num ((b -> a1 -> a1) -> (a2 -> b) -> a2 -> a1 -> a1)) => (b -> a1) -> (a2 -> b) -> a2 -> a1 -> a1
07:15:25 <EvanR> \o/
07:15:26 <int-e> anyway, just voicing an opinion here.
07:15:39 <EvanR> oops no
07:16:21 <int-e> sum [abs (x - median xs) | x <- xs] -- that was a bit too clever for part 1, given what part 2 did
07:16:29 <dmj`> int-e: I don't disagree *shrug*, was hoping for something swanky like (compare `on` fst) .. etc.
07:16:44 <EvanR> the type for (.) . (.) looks like what you're looking for dmj`
07:16:48 <EvanR> aka (.:)
07:17:03 <EvanR> dunno why it turns out crazy
07:17:44 <dmj`> too much point freeness there
07:18:13 <int-e> dmj`: I like quipping that you can recognize point-free code by its abundance of dots.
07:18:23 <EvanR> :t let (.:) = (.).(.) in (abs .: subtract)
07:18:24 <lambdabot> Num c => c -> c -> c
07:18:40 <EvanR> > let (.:) = (.).(.) in (abs .: subtract) 4 6
07:18:42 <lambdabot> 2
07:18:46 <EvanR> > let (.:) = (.).(.) in (abs .: subtract) 6 4
07:18:47 <lambdabot> 2
07:19:04 <EvanR> see also (.::) = (.).(.).(.)
07:19:09 <int-e> Note how .: has *three* dots ;-)
07:19:33 int-e never acquired a taste for .:
07:20:06 edrx joins (~Eduardo@2804:56c:d2ee:ea00:6dc:e4b2:d28a:5637)
07:21:06 <edrx> hi! is there an easy way to make agda-mode prefer to use a single frame split into two windows instead of two frames?
07:22:41 <Axman6> int-e: looks like you needed my foldl-statistics package
07:23:08 <int-e> Axman6: I use a more base-d approach though
07:23:37 <xerox> int-e: how to interpret those average rank values? 12 is 4.8 times .. something .. from 2.5, the first one?
07:24:51 × kennyd quits (~bc8165b6@cerf.good1.com) (Quit: CGI:IRC (Session timeout))
07:24:51 <int-e> xerox: Hmm, what's that 4.8? 12 is 9.5 ranks below 2.5.
07:25:16 <xerox> ah!! just diff, I did a division
07:25:21 <xerox> gotcha
07:25:40 edrx parts (~Eduardo@2804:56c:d2ee:ea00:6dc:e4b2:d28a:5637) (Killed buffer)
07:25:50 bollu joins (uid233390@id-233390.helmsley.irccloud.com)
07:26:26 senoraraton joins (~senorarat@192-195-83-130.static.monkeybrains.net)
07:27:49 max22- joins (~maxime@lfbn-ren-1-762-224.w81-53.abo.wanadoo.fr)
07:28:05 yauhsien joins (~yauhsien@61-231-32-247.dynamic-ip.hinet.net)
07:29:32 <int-e> xerox: So for example if A has ranks 4 and 1 for parts 1 and 2, and B has ranks 3 and 21, that would average to 2.5 and 12, an 9.5 is the average of -1 (B is one place above A in part 1) and 20 (B is 20 places below A in part 2).
07:30:50 <int-e> But the main point of this computation is that we are familiar with the idea that 1 is the best possible rank. So it's more intuitive than taking the actual scores and put them into relation with 14*191 = 2674.
07:31:21 <int-e> (It's also annoying because the number of users can change)
07:31:26 <xerox> yeah
07:31:48 <xerox> it'd be cool to see the rankings in your simpler scale, but only for the people who finished them all
07:31:54 <xerox> you'd have to take the json and filter it out I guess
07:33:03 × jrm quits (~jrm@156.34.187.65) (Ping timeout: 265 seconds)
07:35:11 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
07:35:28 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
07:36:55 × danso quits (~danso@23-233-111-52.cpe.pppoe.ca) (Ping timeout: 256 seconds)
07:41:25 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
07:41:43 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
07:43:23 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
07:43:40 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
07:44:47 neurocyte0132889 joins (~neurocyte@94.46.70.70)
07:44:47 × neurocyte0132889 quits (~neurocyte@94.46.70.70) (Changing host)
07:44:47 neurocyte0132889 joins (~neurocyte@user/neurocyte)
07:45:48 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Ping timeout: 276 seconds)
07:47:26 FinnElija joins (~finn_elij@user/finn-elija/x-0085643)
07:49:04 dhouthoo joins (~dhouthoo@178-117-36-167.access.telenet.be)
07:53:28 × senoraraton quits (~senorarat@192-195-83-130.static.monkeybrains.net) (Ping timeout: 265 seconds)
07:55:01 simendsjo joins (~user@84.211.91.241)
07:55:40 × yauhsien quits (~yauhsien@61-231-32-247.dynamic-ip.hinet.net) (Remote host closed the connection)
07:55:43 genieliu_ joins (~genieliu@103.37.140.24)
07:56:33 × genieliu quits (~genieliu@103.37.140.38) (Ping timeout: 252 seconds)
07:56:56 deadmarshal joins (~deadmarsh@95.38.118.214)
08:00:36 xsebek joins (~xsebek@176.74.150.21)
08:02:07 × xsebek quits (~xsebek@176.74.150.21) (Client Quit)
08:03:50 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
08:04:07 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
08:05:47 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
08:06:05 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
08:07:45 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
08:08:03 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
08:11:56 senoraraton joins (~senorarat@192-195-83-130.static.monkeybrains.net)
08:13:32 dschrempf joins (~dominik@070-207.dynamic.dsl.fonira.net)
08:15:24 × Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer)
08:18:49 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
08:19:07 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
08:20:00 mcgroin joins (~mcgroin@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr)
08:20:37 × senoraraton quits (~senorarat@192-195-83-130.static.monkeybrains.net) (Ping timeout: 256 seconds)
08:23:15 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
08:23:33 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
08:25:13 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
08:25:31 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
08:27:11 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
08:27:29 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
08:29:09 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
08:29:27 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
08:30:26 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
08:30:39 × emf quits (~emf@2620:10d:c091:480::1:1ebc) (Ping timeout: 252 seconds)
08:33:46 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
08:33:54 cfricke joins (~cfricke@user/cfricke)
08:34:02 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
08:35:42 emf joins (~emf@2620:10d:c091:480::1:1ebc)
08:36:07 <dminuoso> Is there some cute trick to have a list of acceptable parameters in optparse-applicative?
08:38:05 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
08:38:23 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
08:38:41 <dminuoso> Ideally I'd love being able to say: enumArgument [Choice "foo" Foo, Choice "bar" Bar] (long "thing" <> showDefault <> value (Choice "foo" Foo))
08:38:44 <mjrosenb> can lsp give me the list of things that I need to implement for a class instance?
08:39:29 notzmv joins (~zmv@user/notzmv)
08:39:30 <dminuoso> mjrosenb: Well GHC would warn you about missing method implementations, so there's that at least.
08:40:37 <[exa]> dminuoso: the tradition kinda dictates that these should form separate switches/flags/subcommands but yeah having one would be great
08:44:48 × ph88 quits (~ph88@ip5f5af068.dynamic.kabel-deutschland.de) (Quit: Leaving)
08:46:35 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
08:46:53 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
08:48:13 <dminuoso> [exa]: None of these are good alternatives though.
08:48:38 <dminuoso> [exa]: With switches/flags you cannot model exlusivitiy, and I dont think you can have commands conditional based on the presence of another switch/flag.
08:48:40 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:e52b:eca6:e736:3c6b) (Remote host closed the connection)
08:50:12 × econo quits (uid147250@user/econo) (Quit: Connection closed for inactivity)
08:51:16 <[exa]> dminuoso: conditional ones work with subparses/subcommands, but that doesn't really solve your problem
08:52:06 <[exa]> I was solving a similar thing with one gpg-style utility, you can smash various combinations of verify/decrypt/encrypt/sign/ascii/cleartext/detached in there and it would really have helped to have an enumerable monoid or something in there
08:52:40 <[exa]> otoh honestly I don't see that logic being portable to anywhere else
08:53:13 <dminuoso> Internally I think all we have to do is add another field to OptPropertiers
08:54:12 <dminuoso> Or maybe not, gah this lack of documentation is ghastly.
08:57:21 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
08:57:39 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
08:59:19 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
08:59:37 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
09:00:08 × gdhffd[m] quits (~gdhffdmat@2001:470:69fc:105::1:799) (Quit: You have been kicked for being idle)
09:00:14 × kevin[m]1 quits (~pnotequal@2001:470:69fc:105::a54) (Quit: You have been kicked for being idle)
09:01:54 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
09:02:11 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
09:03:50 × euandreh quits (~euandreh@2804:14c:33:9fe5:b36c:1fc0:956d:d06c) (Ping timeout: 252 seconds)
09:03:54 × perrierjouet quits (~perrier-j@modemcable012.251-130-66.mc.videotron.ca) (Quit: WeeChat 3.3)
09:04:52 machinedgod joins (~machinedg@142.169.78.167)
09:05:05 perrierjouet joins (~perrier-j@modemcable012.251-130-66.mc.videotron.ca)
09:05:35 euandreh joins (~euandreh@2804:14c:33:9fe5:da4:9ec6:5ef5:74d6)
09:05:53 × spoofer quits (~spoofer@64.185.111.205) (Ping timeout: 256 seconds)
09:06:02 spoofer joins (~spoofer@64.185.111.205)
09:07:12 Gurkenglas joins (~Gurkengla@dslb-002-203-144-204.002.203.pools.vodafone-ip.de)
09:08:04 <merijn> dminuoso: I have a bunch
09:08:30 user0 joins (~aj@langw.roketelkom.co.ug)
09:09:10 <merijn> dminuoso: https://github.com/merijn/Belewitte/blob/master/benchmark-analysis/src/OptionParsers.hs#L481-L508
09:09:50 yauhsien joins (~yauhsien@61-231-32-247.dynamic-ip.hinet.net)
09:12:39 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
09:12:58 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
09:14:38 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
09:14:40 × yauhsien quits (~yauhsien@61-231-32-247.dynamic-ip.hinet.net) (Ping timeout: 265 seconds)
09:14:56 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
09:17:34 allbery_b joins (~geekosaur@xmonad/geekosaur)
09:17:34 × geekosaur quits (~geekosaur@xmonad/geekosaur) (Killed (NickServ (GHOST command used by allbery_b)))
09:17:37 allbery_b is now known as geekosaur
09:20:53 × emf quits (~emf@2620:10d:c091:480::1:1ebc) (Ping timeout: 252 seconds)
09:21:31 <dminuoso> merijn: Oh just what I was looking for!
09:22:04 <dminuoso> Mmm, but this I cannot copy and paste due to the licensing involved.
09:22:18 user01 joins (~aj@154.0.137.32)
09:23:14 <dminuoso> Any chance you can submit these combinators to optparse-applicative?
09:24:09 <merijn> tbh, I'm not sure they're general enough to really fit in?
09:25:49 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
09:26:05 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
09:26:45 × user0 quits (~aj@langw.roketelkom.co.ug) (Ping timeout: 265 seconds)
09:27:56 <dminuoso> Perhaps, Ill just write it myself then. :)
09:28:18 <dminuoso> Somewhat relatedly, is there a name for data types that support an isomorphism `T a b ~~~ T b a`?
09:30:06 <merijn> Not really, afaik?
09:32:05 <dminuoso> Something like commutatitve bifunctor
09:33:13 <dminuoso> Guess this is the categorical description. A bifunctor that commutes up to isomorphism
09:33:15 acidjnk_new joins (~acidjnk@p200300d0c7271e6304137ec8947839cf.dip0.t-ipconnect.de)
09:34:55 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
09:34:58 danso joins (~danso@23-233-111-52.cpe.pppoe.ca)
09:35:12 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
09:36:52 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
09:37:10 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
09:38:50 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
09:39:02 Guest89 joins (~Guest89@103.159.184.187)
09:39:08 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
09:39:12 × Guest89 quits (~Guest89@103.159.184.187) (Client Quit)
09:39:40 <merijn> Weirdly I found today and yesterday's puzzles much easier than day 4-5
09:39:57 × danso quits (~danso@23-233-111-52.cpe.pppoe.ca) (Ping timeout: 256 seconds)
09:42:11 jakalx parts (~jakalx@base.jakalx.net) (Error from remote client)
09:42:45 <int-e> merijn: This may be deliberate... either because 4th and 5th were on the weekend or an attempt to make https://adventofcode.com/2021/stats look more like a christmas tree.
09:42:56 × tzh quits (~tzh@c-24-21-73-154.hsd1.or.comcast.net) (Quit: zzz)
09:44:26 emf joins (~emf@2620:10d:c091:480::1:1ebc)
09:45:08 <merijn> :p
09:49:05 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:b5e5:6571:976d:7afc)
09:50:31 × ubert quits (~Thunderbi@p200300ecdf0ba286bd3e231ce6977cbe.dip0.t-ipconnect.de) (Quit: ubert)
09:52:56 danso joins (~danso@23-233-111-52.cpe.pppoe.ca)
09:54:37 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b5e5:6571:976d:7afc) (Ping timeout: 252 seconds)
09:54:39 × perrierjouet quits (~perrier-j@modemcable012.251-130-66.mc.videotron.ca) (Quit: WeeChat 3.3)
09:55:36 synthmeat1 is now known as synthmeat
09:59:23 × shailangsa quits (~shailangs@host86-186-136-27.range86-186.btcentralplus.com) (Ping timeout: 252 seconds)
09:59:47 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
10:00:05 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
10:00:51 × emf quits (~emf@2620:10d:c091:480::1:1ebc) (Ping timeout: 252 seconds)
10:02:07 desantra joins (~skykanin@user/skykanin)
10:02:44 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
10:03:01 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
10:04:36 jakalx joins (~jakalx@base.jakalx.net)
10:07:03 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
10:07:21 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
10:09:46 × Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 265 seconds)
10:12:31 Lord_of_Life joins (~Lord@user/lord-of-life/x-2819915)
10:15:29 × zaquest quits (~notzaques@5.130.79.72) (Remote host closed the connection)
10:15:34 × genieliu_ quits (~genieliu@103.37.140.24) (Ping timeout: 265 seconds)
10:16:57 × desantra quits (~skykanin@user/skykanin) (Quit: WeeChat 3.3)
10:18:10 desantra joins (~skykanin@user/skykanin)
10:20:05 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
10:20:23 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
10:20:51 zaquest joins (~notzaques@5.130.79.72)
10:29:35 × simendsjo quits (~user@84.211.91.241) (Ping timeout: 265 seconds)
10:32:33 CiaoSen joins (~Jura@p200300c9570204002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
10:35:23 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
10:35:41 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
10:37:21 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
10:37:39 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
10:38:55 xkuru joins (~xkuru@user/xkuru)
10:41:06 shailangsa joins (~shailangs@host86-186-136-27.range86-186.btcentralplus.com)
10:43:07 × johnw quits (~johnw@2607:f6f0:3004:1:c8b4:50ff:fef8:6bf0) (Quit: ZNC - http://znc.in)
10:43:43 johnw joins (~johnw@2607:f6f0:3004:1:c8b4:50ff:fef8:6bf0)
10:44:29 × Erutuon quits (~Erutuon@user/erutuon) (Ping timeout: 252 seconds)
10:46:09 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
10:46:26 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
10:47:37 __monty__ joins (~toonn@user/toonn)
10:49:47 raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
10:52:23 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
10:52:41 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
10:53:03 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 256 seconds)
10:53:25 jrm joins (~jrm@156.34.249.199)
10:54:33 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
10:54:43 × dschrempf quits (~dominik@070-207.dynamic.dsl.fonira.net) (Ping timeout: 265 seconds)
10:58:38 teo joins (~teo@user/teo)
11:00:19 × whatsupdoc quits (uid509081@id-509081.hampstead.irccloud.com) (Quit: Connection closed for inactivity)
11:03:44 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
11:04:01 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
11:04:52 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 265 seconds)
11:05:47 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
11:06:37 × machinedgod quits (~machinedg@142.169.78.167) (Ping timeout: 240 seconds)
11:08:17 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
11:08:32 machinedgod joins (~machinedg@135-23-192-217.cpe.pppoe.ca)
11:08:35 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
11:09:16 [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470)
11:11:01 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 240 seconds)
11:11:30 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
11:13:59 burnsidesLlama joins (~burnsides@dhcp168-017.wadham.ox.ac.uk)
11:15:37 × bollu quits (uid233390@id-233390.helmsley.irccloud.com) (Quit: Connection closed for inactivity)
11:19:30 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
11:19:47 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
11:21:27 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
11:21:45 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
11:22:12 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 268 seconds)
11:22:34 × Vajb quits (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer)
11:22:52 Vajb joins (~Vajb@nalkaylds2h97nzof-2.v6.elisa-mobile.fi)
11:22:54 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
11:24:08 darchitect joins (~darchitec@2a00:23c6:3584:df00:7dec:bf13:8fa:748c)
11:24:43 pfurla joins (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14)
11:26:23 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
11:26:41 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
11:27:44 × geekosaur quits (~geekosaur@xmonad/geekosaur) (Remote host closed the connection)
11:27:49 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 240 seconds)
11:28:32 ph88 joins (~ph88@ip5f5af068.dynamic.kabel-deutschland.de)
11:28:36 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
11:28:36 lavaman joins (~lavaman@98.38.249.169)
11:29:35 geekosaur joins (~geekosaur@xmonad/geekosaur)
11:31:33 perrierjouet joins (~perrier-j@modemcable012.251-130-66.mc.videotron.ca)
11:33:13 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
11:33:17 × lavaman quits (~lavaman@98.38.249.169) (Ping timeout: 256 seconds)
11:33:30 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
11:33:46 InternetCitizen joins (~fuzzypixe@eth-west-pareq2-46-193-4-100.wb.wifirst.net)
11:33:52 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 265 seconds)
11:34:08 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
11:37:09 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
11:37:27 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
11:39:25 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 240 seconds)
11:39:51 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
11:41:31 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
11:41:48 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
11:42:10 × pfurla quits (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14) (Quit: gone to sleep. ZZZzzz…)
11:42:27 cosimone joins (~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20)
11:42:32 thevishy joins (~Nishant@2405:201:f005:c007:a5d7:38b:39cd:e2ae)
11:45:39 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
11:45:57 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
11:47:01 × InternetCitizen quits (~fuzzypixe@eth-west-pareq2-46-193-4-100.wb.wifirst.net) (Ping timeout: 240 seconds)
11:49:37 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
11:49:55 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
11:50:18 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 265 seconds)
11:50:56 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
11:51:26 Morrow joins (~quassel@bzq-110-168-31-106.red.bezeqint.net)
11:52:10 pfurla joins (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14)
11:52:46 jakalx parts (~jakalx@base.jakalx.net) ()
11:53:02 × pfurla quits (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14) (Client Quit)
11:53:46 yauhsien joins (~yauhsien@61-231-32-247.dynamic-ip.hinet.net)
11:53:49 × CiaoSen quits (~Jura@p200300c9570204002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 240 seconds)
11:55:49 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 240 seconds)
11:56:39 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
11:58:31 × yauhsien quits (~yauhsien@61-231-32-247.dynamic-ip.hinet.net) (Ping timeout: 265 seconds)
11:59:51 jakalx joins (~jakalx@base.jakalx.net)
12:01:21 pfurla joins (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14)
12:07:11 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
12:07:30 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
12:07:42 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 265 seconds)
12:07:56 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
12:08:03 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
12:08:20 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
12:10:31 pretty_dumm_guy joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655)
12:12:07 × pavonia quits (~user@user/siracusa) (Quit: Bye!)
12:12:53 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Ping timeout: 256 seconds)
12:13:01 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 240 seconds)
12:13:04 <phaazon> jle`: :D
12:13:28 <phaazon> today’s AoC was interesting because my text solution for part 2 had an error :)
12:13:36 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
12:13:41 <phaazon> I still validated my output and it worked, so I know something was wrong with the text :D
12:14:10 <hpc> AoC is just reaching new levels of programming authenticity
12:18:43 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 252 seconds)
12:19:09 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
12:20:19 <phaazon> https://github.com/phaazon/advent-of-code-2021/blob/master/day07/src/main.rs today was quite boring actually
12:20:27 <phaazon> I should rewrite it in Haskell for more fun!
12:22:00 × pfurla quits (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14) (Quit: gone to sleep. ZZZzzz…)
12:22:42 × LiaoTao quits (~LiaoTao@gateway/tor-sasl/liaotao) (Ping timeout: 276 seconds)
12:25:06 × yaroot quits (~yaroot@2409:12:ac0:2300:680e:dbff:fe1e:4953) (Ping timeout: 268 seconds)
12:26:01 yaroot joins (~yaroot@175.0.30.125.dy.iij4u.or.jp)
12:27:41 × nfd quits (~nfd@user/nfd) (Ping timeout: 256 seconds)
12:28:18 CiaoSen joins (~Jura@p200300c9570204002a3a4dfffe84dbd5.dip0.t-ipconnect.de)
12:29:24 × yaroot quits (~yaroot@175.0.30.125.dy.iij4u.or.jp) (Remote host closed the connection)
12:29:27 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 265 seconds)
12:30:06 yaroot joins (~yaroot@175.0.30.125.dy.iij4u.or.jp)
12:30:26 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
12:35:25 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 240 seconds)
12:36:12 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
12:36:27 <aplainzetakind> phaazon: I think today's problem is very interesting.
12:40:10 pfurla joins (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14)
12:40:15 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
12:41:27 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 252 seconds)
12:41:28 × tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: Textual IRC Client: www.textualapp.com)
12:41:51 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
12:44:01 × juhp quits (~juhp@128.106.188.82) (Quit: juhp)
12:44:14 juhp joins (~juhp@128.106.188.82)
12:44:37 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Ping timeout: 256 seconds)
12:48:25 × mvk quits (~mvk@2607:fea8:5cdd:f000::9788) (Ping timeout: 252 seconds)
12:50:07 hltk joins (~hltk@hltk.fi)
12:50:49 <phaazon> aplainzetakind: for quadratic, it’s not
12:51:00 <phaazon> for the linear solution, yeah, probably
12:51:05 <fendor[m]> Shout-out to aeson-combinators, I love this library
12:51:09 <phaazon> but I haven’t really looked into it
12:52:02 yauhsien joins (~yauhsien@61-231-32-247.dynamic-ip.hinet.net)
12:52:10 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 265 seconds)
12:52:15 <aplainzetakind> Yes, to solve it somehow is boring. But I'm hung up on thinking about part 2.
12:52:39 <hltk> hi guys, i was solving today's advent of code problem with my friend, and we were wondering whether it would be possible to avoid some of the lambdas used in the following code
12:52:42 <hltk> ja emmä Roopea voita :E
12:52:48 <hltk> solve dist = foldl1 min $ map (\i -> sum $ map (\x -> dist $ abs $ x-i) l) [0..1000]
12:53:04 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
12:53:47 <aplainzetakind> hltk -> #adventofcode-spoilers
12:54:37 × xkuru quits (~xkuru@user/xkuru) (Remote host closed the connection)
12:55:23 xkuru joins (~xkuru@user/xkuru)
12:56:37 × yauhsien quits (~yauhsien@61-231-32-247.dynamic-ip.hinet.net) (Ping timeout: 240 seconds)
12:56:38 <aplainzetakind> :t minimum
12:56:39 <lambdabot> (Foldable t, Ord a) => t a -> a
12:58:17 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 256 seconds)
12:58:39 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
12:58:57 × pfurla quits (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14) (Quit: gone to sleep. ZZZzzz…)
13:01:26 × max22- quits (~maxime@lfbn-ren-1-762-224.w81-53.abo.wanadoo.fr) (Ping timeout: 252 seconds)
13:01:41 user0 joins (~aj@129.205.7.82)
13:02:05 × burnsidesLlama quits (~burnsides@dhcp168-017.wadham.ox.ac.uk) (Remote host closed the connection)
13:02:08 tromp joins (~textual@dhcp-077-249-230-040.chello.nl)
13:02:48 × user01 quits (~aj@154.0.137.32) (Ping timeout: 265 seconds)
13:04:31 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
13:05:58 dschrempf joins (~dominik@070-207.dynamic.dsl.fonira.net)
13:07:45 mc47 joins (~mc47@xmonad/TheMC47)
13:07:51 × dschrempf quits (~dominik@070-207.dynamic.dsl.fonira.net) (Client Quit)
13:08:59 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Ping timeout: 256 seconds)
13:09:05 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 265 seconds)
13:10:00 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
13:15:11 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 252 seconds)
13:15:51 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
13:19:15 pfurla joins (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14)
13:21:10 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 265 seconds)
13:21:26 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
13:22:06 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
13:22:46 timCF joins (~timCF@m91-129-100-224.cust.tele2.ee)
13:25:53 Kaipi joins (~Kaiepi@156.34.44.192)
13:27:22 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
13:27:25 × Kaiepi quits (~Kaiepi@156.34.44.192) (Ping timeout: 240 seconds)
13:27:27 user01 joins (~aj@154.0.137.32)
13:27:40 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
13:28:31 <timCF> Hello! Is there some easy/standard way to unlift type to a value level? For something like `data Role = Maker | Taker` and `newtype Fee (role :: Role) = Fee Rational` I want a function like `roleOf :: a (role :: Role) -> Role`. First idea is just to have a class `RoleOf` and implement it for `Fee 'Maker` and `Fee 'Taker` but it does not look very ergonomic, maybe there is easier or more generic way?
13:28:54 × user0 quits (~aj@129.205.7.82) (Ping timeout: 265 seconds)
13:28:55 <dminuoso> timCF: Welcome to `singletons`
13:29:13 <timCF> :)
13:29:16 × desantra quits (~skykanin@user/skykanin) (Quit: WeeChat 3.3)
13:29:23 slowButPresent joins (~slowButPr@user/slowbutpresent)
13:29:37 <timCF> dminuoso: probably I can't ignore existence of this library anymore)
13:30:46 <dminuoso> timCF: In singletons you'd just use `fromSing` or `demote`
13:30:47 × Vajb quits (~Vajb@nalkaylds2h97nzof-2.v6.elisa-mobile.fi) (Read error: Connection reset by peer)
13:32:02 Vajb joins (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi)
13:32:24 <tomsmeding> though you can do the same thing by hand
13:32:50 <dminuoso> Yeah. I mean at the end the ergonomics in singletons comes with a typeclass and an associated tyfam
13:33:12 <dminuoso> class SingKind k where type Demote k = (r :: Type) | r -> k; fromSing :: Sing (a :: k) -> Demote k; toSing :: Demote k -> SomeSing k
13:33:23 <dminuoso> You may not even need the `toSing` part
13:33:23 <tomsmeding> you can use a class as you wrote, or if you want to pass around the evidence manually, "data RoleS a where MakerS :: RoleS 'Maker ; TakerS :: RoleS 'Taker", then pass that around
13:33:31 <merijn> timCF: RIP your mental health xD
13:33:32 <tomsmeding> that GADT is a link between type-level and value-level
13:33:33 Pickchea joins (~private@user/pickchea)
13:33:54 <merijn> If I never have to use singletons again, I'll be so happy :p
13:34:15 mmhat joins (~mmh@55d4422a.access.ecotel.net)
13:34:49 <dminuoso> How do I make lambdabot recite remembered quotes?
13:35:07 burnsidesLlama joins (~burnsides@dhcp168-017.wadham.ox.ac.uk)
13:35:31 <merijn> @quote
13:35:32 <lambdabot> taktoa says: "OOP is pseudoscience"
13:35:42 <merijn> optionall with a name and substring
13:35:45 <merijn> @quote merijn
13:35:45 <lambdabot> merijn says: I like how C-beginners is "I wanna read a file from disk" and #haskell-beginers is all "Yeah, I don't quite understand higher abstract mathematics" ;)
13:35:57 <merijn> @quote merijn standard.time
13:35:57 <lambdabot> merijn says: I run on HST (Hacker Standard Time) which is essentially current time zone -3
13:36:08 <dminuoso> @quote awpr
13:36:09 <lambdabot> awpr says: when I write idris, I just write my bugs at the type level instead
13:36:18 <dminuoso> This came to mind when thinking about singletons.
13:36:58 <tomsmeding> merijn: is the dot a glob *, or something else?
13:37:26 <merijn> tomsmeding: no clue
13:37:35 <merijn> I think it's just a space?
13:37:38 <merijn> @quote merijn standard time
13:37:38 <lambdabot> merijn says: I run on HST (Hacker Standard Time) which is essentially current time zone -3
13:37:53 <timCF> Hmm, I still have no idea are singletons good or bad, before avoided this library because of big readme, kinda learning this feels like investment)
13:37:57 <merijn> might just be historical reasons that was necessary and no obsolete
13:38:24 <merijn> timCF: It's not that singletons is bad. It's that "singletons" implies you're trying to do way too much on the type level and *that* is bad
13:38:51 <merijn> because IMO it's almost never worth it in Haskell
13:40:01 × burnsidesLlama quits (~burnsides@dhcp168-017.wadham.ox.ac.uk) (Ping timeout: 265 seconds)
13:40:16 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Remote host closed the connection)
13:40:40 FinnElija joins (~finn_elij@user/finn-elija/x-0085643)
13:41:01 <tomsmeding> @quote merijn wanna.*beg.*abs
13:41:02 <lambdabot> merijn says: I like how C-beginners is "I wanna read a file from disk" and #haskell-beginers is all "Yeah, I don't quite understand higher abstract mathematics" ;)
13:41:05 <tomsmeding> it's a regex
13:41:19 <tomsmeding> https://github.com/lambdabot/lambdabot/blob/master/lambdabot-novelty-plugins/src/Lambdabot/Plugin/Novelty/Quote.hs#L183
13:41:29 <merijn> I don't recall saying that, tbh. but then it's not the only quote of mine I don't recall :p
13:42:48 <timCF> merijn: I've heard exactly the same when I was introducing typed-like compile-time computations in Elixir with macros, at some point my co-workers mostly stopped understanding my code :)
13:43:41 shriekingnoise joins (~shrieking@186.137.144.80)
13:44:42 <merijn> timCF: The thing is that doing stuff at the type level in Haskell is often tedious and makes code overly rigid, which means refactoring becomes a pain. Often you can get, like, 80-90% of the benefit with some focus on "make illegal values irrepresentible" and some minimal error checking/reporting
13:46:22 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
13:46:39 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
13:48:19 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
13:48:37 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
13:49:21 <dminuoso> Never forget the maintenance cost and readability cost of fancy tricks.
13:49:55 AndreasK joins (sid320732@id-320732.uxbridge.irccloud.com)
13:50:37 <merijn> You can have a statically enforced invariant at the type level! Or you can just write 1 function that checks preconditions and converts to a safe datatype with type "... -> Either MyError Result"
13:51:04 <dminuoso> The difficult thing is, this is a gradual road. At first you start with DataKinds and phantom types, and this seems like a brilliant idea. Then you realize, you might want higher kinded data types with tyfams that translate those phantom types into say functors, and gradually you increase complexity without even noticing it.
13:51:21 × bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Quit: = "")
13:51:47 <merijn> And before you know it compilation takes 1 hour and refactoring is near impossible, because it breaks all type level invariants :p
13:52:00 <dminuoso> timCF: And remember, every additional type-level trick you introduce is going to drastically reduce the quality of compiler errors if you or anyone else either trips a bug, or trips something you didn't think of before.
13:52:18 <dminuoso> With Haskell, type level programming requires a wizard to understand what error messages mean
13:52:34 × Pickchea quits (~private@user/pickchea) (Quit: Leaving)
13:53:12 <dminuoso> Here's the latest result from `optics`, which is a version of `lens` that tries to hide the type level machinery and expose human readable type errors... using type level machinery:
13:53:16 yauhsien joins (~yauhsien@61-231-32-247.dynamic-ip.hinet.net)
13:53:33 <dminuoso> • A_Lens cannot be composed with A_Lens
13:54:11 <dminuoso> There you have a bug in the type level machinery that tries to hide the other, way more complicated, type level machinery, from the user. What am I to make of this?
13:55:14 Kauto joins (~Kauto@wireless-student-pt10-183-60.lut.ac.uk)
13:55:27 <merijn> I mean, a lot of these tricks *are* useful. But type level hackery are like spices. A little can go a long way and the trick is learning which you need and when :p
13:56:04 <dminuoso> Yeah, and its hard to know when you crossed that river.
13:56:27 <dminuoso> My rule has been to avoid the temptation of type level tricks.
13:58:13 × yauhsien quits (~yauhsien@61-231-32-247.dynamic-ip.hinet.net) (Ping timeout: 268 seconds)
13:59:53 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
14:00:10 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
14:00:36 × Kauto quits (~Kauto@wireless-student-pt10-183-60.lut.ac.uk) (Quit: Client closed)
14:02:50 max22- joins (~maxime@2a01cb08833598007c67d5d567ef7941.ipv6.abo.wanadoo.fr)
14:04:30 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
14:04:47 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
14:06:27 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
14:06:45 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
14:07:16 burnsidesLlama joins (~burnsides@dhcp168-017.wadham.ox.ac.uk)
14:07:44 Super11 joins (~Super11@wireless-student-pt10-183-60.lut.ac.uk)
14:08:25 stef204 joins (~stef204@user/stef204)
14:10:42 × timCF quits (~timCF@m91-129-100-224.cust.tele2.ee) (Quit: leaving)
14:12:59 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
14:13:17 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
14:14:30 kronicmage joins (user91577@neotame.csclub.uwaterloo.ca)
14:19:13 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
14:19:31 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
14:23:11 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
14:23:11 × max22- quits (~maxime@2a01cb08833598007c67d5d567ef7941.ipv6.abo.wanadoo.fr) (Remote host closed the connection)
14:23:28 max22- joins (~maxime@2a01cb08833598005e821d007c542121.ipv6.abo.wanadoo.fr)
14:23:29 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
14:24:24 slack1256 joins (~slack1256@191.125.99.210)
14:25:33 kennyd joins (~bc8165b6@cerf.good1.com)
14:27:13 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
14:27:31 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
14:28:00 <boxscape> % -1 `mod` 3
14:28:01 <yahb> boxscape: -1
14:28:33 quickquack joins (~quickquac@190.18.214.197)
14:28:34 systemhalted joins (~systemhal@130.51.137.77)
14:28:41 boxscape_ joins (~boxscape_@p4ff0bb6c.dip0.t-ipconnect.de)
14:29:03 <boxscape_> % :set -XLexicalNegation
14:29:03 <yahb> boxscape_:
14:29:10 <boxscape_> % -1 mod 3
14:29:10 <yahb> boxscape_: ; <interactive>:10:1: error:; * Could not deduce (Integral a0); from the context: (Integral a, Num t, Num ((a -> a -> a) -> t -> t1)); bound by the inferred type for `it':; forall {a} {t} {t1}. (Integral a, Num t, Num ((a -> a -> a) -> t -> t1)) => t1; at <interactive>:10:1-8; The type variable `a0' is ambiguous; * In the ambiguity check for the infer
14:29:15 <boxscape_> % -1 `mod` 3
14:29:15 <yahb> boxscape_: 2
14:29:33 <boxscape_> pop quiz: With LexicalNegation, what has higher precedence - record updates or negation?
14:32:09 × systemhalted quits (~systemhal@130.51.137.77) (Remote host closed the connection)
14:33:03 waleee joins (~waleee@2001:9b0:216:8200:d457:9189:7843:1dbd)
14:35:33 <Super11> hello everyone, haskell beginner here. I'm trying to create a function that would take 2 string and for when they have the same letters they would be replaced with asterixes, for example findReplace "abc" "abcd" = "***" here is my code so far https://paste.tomsmeding.com/tLcdDDLD any help would be great
14:35:35 lavaman joins (~lavaman@98.38.249.169)
14:36:08 wroathe joins (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net)
14:36:08 × wroathe quits (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net) (Changing host)
14:36:08 wroathe joins (~wroathe@user/wroathe)
14:37:55 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
14:38:12 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
14:39:52 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
14:40:10 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
14:40:11 doyougnu joins (~doyougnu@c-73-25-202-122.hsd1.or.comcast.net)
14:40:26 × lavaman quits (~lavaman@98.38.249.169) (Ping timeout: 265 seconds)
14:40:52 <geekosaur> boxscape_, since LexicalNegation is done in the lexer, I'd expect it to have highest "precedence"
14:41:47 <geekosaur> (more correctly, precedence doesn't apply: the number is actually lexed as negative instead of a "negate" being inserted into the token stream)
14:42:47 <boxscape> geekosaur: Nope, -x {a = 100} is parsed as -(x {a = 100}). Which is nice actually, because that means it also makes sense for record creation, i.e. -A {a = 100} is parsed the same way
14:42:54 <boxscape> wait
14:43:02 <boxscape> let me make sure I actually had -XLexicalNegation enabled :)
14:43:15 <boxscape> yes
14:43:19 <geekosaur> that's not LexicalNegation though, as I understand it
14:43:24 <geekosaur> it's still a negate token
14:44:06 <boxscape> oh, so LexicalNegation only affects literals?
14:44:13 <geekosaur> as I understand it, yes
14:44:20 <boxscape> I see
14:44:21 <geekosaur> I may be wrong but that's my impression
14:45:14 <boxscape> % let x = 1 in -x `mod` 3
14:45:14 <yahb> boxscape: -1
14:45:29 lbseale joins (~ep1ctetus@user/ep1ctetus)
14:45:45 <boxscape> % :set -XLexicalNegation
14:45:46 <yahb> boxscape:
14:45:57 <boxscape> % let x = 1 in -x `mod` 3
14:45:57 <yahb> boxscape: -1
14:46:01 <boxscape> hmm
14:46:09 <boxscape> I'm getting a different result in ghc 9.2.1
14:46:39 <geekosaur> mm, I'mtrying to decipher what the manual actually says. "NegativeLiterals is a subset of LexicalNegation such that enabling both is the same as LexicalNegation" (from the 9.2.1 manual)
14:48:12 <boxscape> it seems to apply to non-literals in 9.2.1, in any case
14:48:14 <geekosaur> ok, so rereading all of this, negative *literals* are in fact handled the way I said but LexicalNegation changes how negation is lexed. so I guess what I said is still true
14:48:36 × kennyd quits (~bc8165b6@cerf.good1.com) (Quit: CGI:IRC (Ping timeout))
14:48:47 <geekosaur> still inbserts a negate token for nonliterals, it just changes the rules for doing so
14:48:55 <boxscape> I see
14:49:20 <geekosaur> and negate will still have its usual precedence
14:49:49 kennyd joins (~bc8165b6@cerf.good1.com)
14:50:32 bollu joins (uid233390@id-233390.helmsley.irccloud.com)
14:51:17 <cigsender> et serviceTypeForm :: Form ServiceType
14:51:17 <cigsender> serviceTypeForm csrf = do
14:51:17 <cigsender> ServiceType{..} <- lift $ getServiceType w
14:51:17 <cigsender> tadServiceTypes <-
14:51:17 <cigsender> lift . fmap mkOptionList . keyOptions $ [ Training , LanguageInstruction
14:51:37 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 252 seconds)
14:51:39 <Hecate> cigsender: nice
14:51:41 <boxscape> yeah, okay, `-4 {a = 12}` is parsed differently from `-A {a = 12}`
14:52:23 zer0bitz joins (~zer0bitz@dsl-hkibng32-54fbfb-173.dhcp.inet.fi)
14:52:31 × mcgroin quits (~mcgroin@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr) (Ping timeout: 265 seconds)
14:53:05 × ezzieyguywuf quits (~Unknown@user/ezzieyguywuf) (Read error: Connection reset by peer)
14:53:21 ezzieyguywuf joins (~Unknown@user/ezzieyguywuf)
14:54:48 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:b5e5:6571:976d:7afc)
14:54:57 <cigsender> ugh, sorry
14:57:22 <fizbin> Hey, does anyone know a nicer name for / nicer way to write this function? {someFunc :: (a -> a -> a) -> Maybe a -> Maybe a -> Maybe a; someFunc _ Nothing x = x; someFunc _ x Nothing = x; someFunc f a b = f <$> a <*> b}
14:58:13 <merijn> liftA2 f? :p
14:58:17 <aplainzetakind> f <$> ma <*> mb
14:58:18 <merijn> :t liftA2
14:58:19 <lambdabot> Applicative f => (a -> b -> c) -> f a -> f b -> f c
14:58:29 <fizbin> If 'a' has a Semigroup instance, then 'someFunc (<>)' is just (<>) in 'Maybe a'
14:58:52 <merijn> oh, wait
14:59:21 <fizbin> Yeah, that does the wrong thing with Nothing values.
14:59:38 <merijn> How about: 'someFunc f x y = (f <$> x <*> y) <|> x <|> y'
14:59:48 <fizbin> It's a bit like 'unionWith' that you find on many container types.
14:59:53 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b5e5:6571:976d:7afc) (Ping timeout: 268 seconds)
15:00:19 <merijn> Alternately: 'asum [ f <$> x <*> y, x, y ]'
15:01:06 <geekosaur> meanwhile Super11 is still waiting for help…
15:01:19 MoC joins (~moc@user/moc)
15:01:36 <fizbin> Hrm. I wonder, is (\f x y -> (f <$> x <*> y) <|> x <|> y) the same as "unionWith" on those map-like containers that define "unionWith"?
15:01:46 <merijn> geekosaur: If it's not in my scrollback when I switch to my terminal, it doesn't exist :)
15:02:27 <cigsender> Super11: do they need to be in the same position, same order, or just show up?
15:02:52 <Super11> Just show up (y)
15:03:39 <cigsender> have you seen Data.List.elem ?
15:03:42 <cigsender> :t elem
15:03:43 <lambdabot> (Foldable t, Eq a) => a -> t a -> Bool
15:03:54 <cigsender> :t elem @[]
15:03:55 <lambdabot> error:
15:03:55 <lambdabot> Pattern syntax in expression context: elem@[]
15:03:55 <lambdabot> Did you mean to enable TypeApplications?
15:03:56 <Super11> I'm not allowed to use any modules like data.list unfortunately
15:04:02 <Super11> I did read about it
15:04:24 <Super11> hence I've tried to make my own function
15:04:36 <cigsender> how did you define isIn?
15:04:56 <geekosaur> @index elem
15:04:56 <lambdabot> Data.Foldable, Data.List, Prelude, GHC.OldList, Data.ByteString.Lazy.Char8, Data.ByteString.Lazy, Data.ByteString.Char8, Data.ByteString
15:05:03 <geekosaur> it's in the Prelude
15:05:22 <Super11> isIn :: Char -> String -> Bool as it will be a True or false
15:05:47 <fizbin> Okay, that's the type of isIn. What's the definition?
15:07:07 <raehik> % zipWith (\a b -> if a == b then '*' then b) "abc "abcd"
15:07:07 <yahb> raehik: ; <interactive>:18:37: error: parse error on input `then'
15:07:14 <raehik> % zipWith (\a b -> if a == b then '*' then b) "abc" "abcd"
15:07:14 <yahb> raehik: ; <interactive>:19:37: error: parse error on input `then'
15:07:24 <Super11> Oh, I haven't written it since I didn't think I had to as it would just be within the function. I tried to pattern match it if there was an empty list underneath but it didnt work so sorry if thats made me look a bit silly
15:07:32 <raehik> % zipWith (\a b -> if a == b then '*' else b) "abc" "abcd"
15:07:33 <yahb> raehik: "***"
15:07:52 <raehik> sry for spam. Super11 , is that close to what you asked for before?
15:08:00 wroathe joins (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net)
15:08:00 × wroathe quits (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net) (Changing host)
15:08:00 wroathe joins (~wroathe@user/wroathe)
15:08:01 <fizbin> Super11: Also, you're going to need a base case for your findReplace function; something like "findReplace [] _ = somestuffhere"
15:08:04 polezaivsani joins (~polezaivs@orangeshoelaces.net)
15:08:07 <cigsender> raehik, they specifically said order didn't matter
15:08:30 <raehik> ohh thank you cigsender I had focused on the example
15:08:42 <cigsender> <3
15:08:44 <Super11> fizbin yeah I did have one but forgot to copy it
15:08:58 <Super11> since I just put the function in my paste
15:09:24 <fizbin> Okay, so if you define "isIn" properly, and have a base case for when the first argument is [], that should work.
15:10:28 <fizbin> So now, how to define isIn. First, if I were doing this I would spell "isIn" as "elem", since "elem" is a function in the haskell Prelude as basic as "head" or "last".
15:10:45 <Super11> ok
15:10:50 <Super11> I'll get to that then so
15:11:24 <Super11> so elem :: Char -> String -> Bool
15:12:44 <fizbin> It's more general than that, but yes. (it applies to any list, and in fact to any "Traversable"; lists are just one kind of Traversable)
15:12:49 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 265 seconds)
15:13:00 <Super11> since I have elem taking the Char and String within findReplace, how would I go about defining it then? sorry for being a bit confused
15:13:24 <cigsender> elem thisOne [] = _; elem thisOne (x : xs) = _
15:13:38 <fizbin> Oh, what I'm saying is that you don't need to define "elem" since it's built-in.
15:13:44 <Super11> oh right
15:13:45 <cigsender> pattern matching on lists, a list is either empty or has a head and another list
15:14:18 <Super11> so if elem is built in, how would i use it within my function?
15:14:31 <fizbin> But if you *had* to define it, you would start the way cigsender said.
15:14:38 <Super11> right
15:15:04 <fizbin> Instead of "if isIn x ys then" you'd say "if elem x ys then"
15:15:22 <Super11> gotcha
15:16:08 <Super11> so it seems elem is a quite powerful built in function from reading this
15:16:34 × geekosaur quits (~geekosaur@xmonad/geekosaur) (Ping timeout: 256 seconds)
15:17:26 <fizbin> Eh. If you have "a" and a list of "b"s, elem is just doing a simple "a == b" check on every element of the "b"s list.
15:18:50 <Super11> right, but from when doing other exercises, I've seen it used quite a lot a lot more than other functions. But then again it might be because I've been working with lists quite a lot
15:19:19 <fizbin> It's useful, but quite possible to build from scratch, at least the version that only covers lists: elem _ [] = False; elem x (y:ys) = (x == y) || elem x ys
15:21:32 <Super11> (y)  thanks for explaining to me i appreciate it
15:21:50 × pfurla quits (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14) (Quit: gone to sleep. ZZZzzz…)
15:22:11 × cosimone quits (~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20) (Remote host closed the connection)
15:24:47 cosimone joins (~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20)
15:27:25 × stef204 quits (~stef204@user/stef204) (Ping timeout: 240 seconds)
15:27:59 × burnsidesLlama quits (~burnsides@dhcp168-017.wadham.ox.ac.uk) (Remote host closed the connection)
15:28:10 <dsal> @src elem
15:28:10 <lambdabot> elem x = any (== x)
15:31:45 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
15:32:02 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
15:35:18 curiousgay_ joins (~curiousga@77-120-141-90.kha.volia.net)
15:36:38 geekosaur joins (~geekosaur@xmonad/geekosaur)
15:37:01 × curiousgay quits (~curiousga@77-120-141-90.kha.volia.net) (Ping timeout: 240 seconds)
15:41:20 × acidjnk_new quits (~acidjnk@p200300d0c7271e6304137ec8947839cf.dip0.t-ipconnect.de) (Ping timeout: 265 seconds)
15:43:00 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
15:43:17 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
15:43:52 × Super11 quits (~Super11@wireless-student-pt10-183-60.lut.ac.uk) (Quit: Client closed)
15:47:03 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
15:47:20 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
15:49:00 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
15:49:18 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
15:50:58 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
15:51:16 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
15:52:22 shapr joins (~user@pool-100-36-247-68.washdc.fios.verizon.net)
15:53:22 dschrempf joins (~dominik@070-207.dynamic.dsl.fonira.net)
15:56:47 × mikoto-chan quits (~mikoto-ch@esm-84-240-99-143.netplaza.fi) (Ping timeout: 256 seconds)
15:57:07 × dschrempf quits (~dominik@070-207.dynamic.dsl.fonira.net) (Client Quit)
15:57:39 mikoto-chan joins (~mikoto-ch@esm-84-240-99-143.netplaza.fi)
15:59:31 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
15:59:48 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
16:01:24 burnsidesLlama joins (~burnsides@dhcp168-017.wadham.ox.ac.uk)
16:01:42 pfurla joins (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14)
16:03:15 × [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Read error: Connection reset by peer)
16:05:49 × burnsidesLlama quits (~burnsides@dhcp168-017.wadham.ox.ac.uk) (Ping timeout: 240 seconds)
16:08:01 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
16:08:19 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
16:10:12 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
16:10:30 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
16:12:48 × polezaivsani quits (~polezaivs@orangeshoelaces.net) (Remote host closed the connection)
16:15:20 × quickquack quits (~quickquac@190.18.214.197) (Remote host closed the connection)
16:16:09 × chele quits (~chele@user/chele) (Remote host closed the connection)
16:17:38 myShoggoth joins (~myShoggot@97-120-85-195.ptld.qwest.net)
16:18:34 × boxscape_ quits (~boxscape_@p4ff0bb6c.dip0.t-ipconnect.de) (Quit: Connection closed)
16:19:09 boxscape_ joins (~boxscape_@p4ff0bb6c.dip0.t-ipconnect.de)
16:21:03 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
16:21:20 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
16:23:00 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
16:23:17 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
16:23:49 Guest89 joins (~Guest89@2601:483:4101:2350::d66d)
16:25:29 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
16:25:46 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
16:26:30 <yin> is foldr' more appropriate than foldr in `size = foldr' (const succ) 0` ?
16:27:57 <merijn> yin: There is no foldr' ?
16:28:10 <yin> (i know foldl' (flip $ const succ) 0 is better)
16:28:18 <yin> merijn: there is
16:28:53 <merijn> oh, heh
16:29:05 <merijn> When'd that appear >.>
16:29:35 <maerwald> does that do anything different from foldl'?
16:29:51 <merijn> well foldl' is mostly useful to avoid thunk build up
16:30:02 <merijn> but foldr (usually) doesn't really have that issue anyway
16:30:33 <maerwald> that's why it seems rather redundant?
16:31:56 <yin> i don't think it's redundant, i'm just trying to make sure i'm understanding the nuance correctly
16:31:57 × pfurla quits (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14) (Quit: gone to sleep. ZZZzzz…)
16:32:29 <merijn> yin: To be fair, even the docs agree with me and maerwald :p
16:32:39 <merijn> yin: "Right-associative fold of a structure, strict in the accumulator. This is rarely what you want."
16:32:43 <merijn> Note the final sentence :p
16:33:11 <merijn> As opposed to foldl and foldl' where foldl is marked as "rarely what you want"
16:33:36 <yin> the docs should describe how things work, not tell people that "this is rarely want they want"
16:33:49 <merijn> Hard disagree
16:33:51 <geekosaur> it did. "strict in the accumulator"
16:33:52 <yin> yep p
16:34:06 <maerwald> Prelude stuff is read by beginners too
16:34:08 <maerwald> guidance is ok
16:34:15 <merijn> Pointing out that something is almost certainly something you don't want is very useful
16:34:29 Guest89 parts (~Guest89@2601:483:4101:2350::d66d) ()
16:34:33 <merijn> People who know enough to want rarely useful things, also know enough to disregard warnings
16:34:56 <yin> guidance would be explaining why it's not useful in situation x and why it's more useful in situation y
16:35:00 <merijn> > foldr' (const f) 0 [a,b,c,d]
16:35:02 <lambdabot> error:
16:35:02 <lambdabot> • Ambiguous type variable ‘a0’ arising from a use of ‘show_M108104109454...
16:35:02 <lambdabot> prevents the constraint ‘(Show a0)’ from being solved.
16:35:07 <merijn> aww
16:35:35 <merijn> > foldr' (const f) z [a,b,c,d]
16:35:37 <lambdabot> f (f (f (f z)))
16:36:11 <merijn> beccause for foldr being lazy in the accumulator is *good*, it avoid computing the accumulator at all, unless necessary
16:36:14 <geekosaur> it works with "(0::Expr)"
16:36:37 <merijn> For foldl, being lazy is bad, because it *always* has to compute the accumulator and doing so lazily accumulates a whole bunch of useless thunks
16:36:45 <merijn> > foldl' (const f) z [a,b,c,d]
16:36:46 <yin> lambdabot is great!
16:36:47 <lambdabot> f d
16:36:57 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
16:37:04 × cosimone quits (~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20) (Remote host closed the connection)
16:37:10 zebrag joins (~chris@user/zebrag)
16:37:14 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
16:37:16 <merijn> Actually, clearer
16:37:22 <merijn> > foldl f z [a,b,c,d]
16:37:23 <lambdabot> f (f (f (f z a) b) c) d
16:37:30 cosimone joins (~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20)
16:37:39 <merijn> > foldr f z [a,b,c,d]
16:37:40 <lambdabot> f a (f b (f c (f d z)))
16:38:09 <merijn> Note how, for foldl, the outer call can only return after the whole list is traversed
16:38:31 <yin> oh i know how foldl and foldr work
16:38:35 <merijn> And how for foldr the outer call can immediately return, unless 'f' somehow forces the accumulator
16:39:26 <merijn> yin: foldl' solves the problem of having a massive "f (f (f z a) b) c" thunk (if your list is a million elements, that becomes *big*)
16:39:43 <merijn> foldr never creates such a build up, so making it strict usually doesn't do anything
16:40:13 <EvanR> is this whole diatribe relative to List foldlr' stuff
16:40:26 <EvanR> because some foldables have nice ways to begin at the end so to speak
16:40:50 <EvanR> unlike list
16:41:08 <merijn> EvanR: Practically speaking it applies to *most* Foldable people use regularly (list, nonempty, containers, vector)
16:41:16 <EvanR> vector?
16:41:29 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Ping timeout: 256 seconds)
16:41:30 <merijn> EvanR: So, there are exceptions (as the docs note), but those are, well, exceptions
16:41:32 <EvanR> i can imagine foldr' working
16:41:56 <merijn> EvanR: Vector is Foldable
16:42:04 <EvanR> that's what I'm talking about
16:42:19 <EvanR> is there something wrong with foldr' in that case xD
16:42:30 <merijn> Oh, you mean, foldr' might be efficient for vector too
16:42:38 <EvanR> s/too//
16:42:54 <EvanR> or other foldables that have good ways to start at the end, Sequence
16:42:54 <merijn> EvanR: Vector's foldr' is implemented with foldl', so... :p
16:43:00 <geekosaur> does this matter enough to be worth using?
16:43:18 <EvanR> really well that disqualifies my theory
16:43:36 <merijn> EvanR: Right, but the question was "if foldl' is good, does that mean I should use foldr'?", to which "no" is a decent enough approximation/heuristic
16:43:48 <merijn> EvanR: It's because of vector's streaming optimisations
16:44:02 <EvanR> I think the question was should I use foldl' for this answer yes
16:44:09 <merijn> EvanR: streams are processed left-to-right
16:44:09 ubert joins (~Thunderbi@2a02:8109:9880:303c:31e5:443a:aa23:d51a)
16:44:29 <geekosaur> [07 16:26:31] <yin> is foldr' more appropriate than foldr in `size = foldr' (const succ) 0` ?
16:44:34 <geekosaur> the actual question
16:44:43 <merijn> EvanR: Then you should probably revisit the question ;)
16:44:52 <EvanR> K I didn't make it past this is foldr' more appropriate than foldr in `size = foldr' (const succ) 0` ?
16:44:55 × waleee quits (~waleee@2001:9b0:216:8200:d457:9189:7843:1dbd) (Ping timeout: 252 seconds)
16:44:56 <EvanR> what
16:45:00 <EvanR> I can't read
16:45:19 <merijn> EvanR: :D
16:45:28 <EvanR> I cast summon L6 coffee
16:46:13 × boxscape_ quits (~boxscape_@p4ff0bb6c.dip0.t-ipconnect.de) (Quit: Connection closed)
16:46:16 <merijn> I guess foldr' would be good for snoc lists? Maybe? It's too much thinking to decide whether that's true
16:46:43 <EvanR> isn't a snoc list just a list basically
16:46:50 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:b5e5:6571:976d:7afc)
16:47:12 <geekosaur> yes, it just works from the right instead of the left
16:47:15 <merijn> EvanR: Yes, but append instead of prepend. But I can't be arsed to think how that should affect recursion order
16:47:23 <EvanR> ehm left and right...
16:47:36 <EvanR> the x86 manual is telling me that the grows from top to bottom
16:47:42 <EvanR> I just nod and agree
16:47:47 <EvanR> the stack*
16:47:57 <merijn> yin: Anyway, in summary, except for a handful of niche data structures, it's safe to assume foldr' is worse for most data structures in common use
16:48:52 <merijn> including, but not limited to, lists, nonempty, all things in vector and containers, etc.
16:49:40 <maerwald> well, `foldr (const succ) 0 [1..11111111111111111111111]` causes a stack overflow here and `foldr' (const succ) 0 [1..11111111111111111111111]` doesn't (I'm still waiting for it to finish)
16:50:09 <maerwald> I think it's gonna kill my machine though
16:50:11 <AndreasK> Let us know when it finishes ;D
16:50:35 <maerwald> barely managed to kill the process :D
16:50:40 × tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
16:50:59 <maerwald> so: better use foldr if you value your memory
16:51:33 <EvanR> foldr doesn't always work though
16:51:46 <EvanR> only if what you're doing is sufficiently lazy:tm:
16:52:50 boxscape_ joins (~boxscape_@p4ff0bb6c.dip0.t-ipconnect.de)
16:54:58 jakalx parts (~jakalx@base.jakalx.net) (Error from remote client)
16:59:38 × cheater quits (~Username@user/cheater) (Ping timeout: 265 seconds)
16:59:41 × slack1256 quits (~slack1256@191.125.99.210) (Ping timeout: 256 seconds)
17:00:18 pfurla joins (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14)
17:02:16 <yin> maerwald: that was the answer i was looking for, thanks
17:02:27 × Cajun quits (~Cajun@user/cajun) (Ping timeout: 256 seconds)
17:02:43 jakalx joins (~jakalx@base.jakalx.net)
17:02:44 <yin> i wonder how these things get optimized
17:02:48 cheater joins (~Username@user/cheater)
17:02:53 <maerwald> I used ghci
17:02:57 <maerwald> so probably no optimization
17:03:04 <EvanR> ok the foldable laws on hackage are kind of illuminating
17:03:36 gensyst joins (gensyst@user/gensyst)
17:04:20 <gensyst> What is your opinion of calling a private function "funcName_" (ending underscore) to make absolutely clear to everybody that it should never be exported?
17:04:45 <maerwald> gensyst: the convention is rather using Foo.Internal modules
17:04:51 <maerwald> and expose everything
17:04:53 <gensyst> Thanks!
17:04:59 <gensyst> I forgot about that one
17:05:03 <Rembane> gensyst: Or put it in a where-expression if it's a very local function
17:05:05 <dminuoso> gensyst: I use underscore names as module-internal names.
17:05:17 <maerwald> if your users depend on internal modules, it's their problem... you don't need to follow PVP for those
17:05:18 <geekosaur> trailing _ already has a meaning, anyway: ignore lack of use
17:05:59 <dminuoso> geekosaur: The GHC codebase sometimes uses trailing underscores to denote module-internal, or sometimes internal-implementation for some wrapper function.
17:05:59 <maerwald> if you don't expose internal modules, you will make some use cases harder (e.g. semi-fork packages, that re-implement only parts)
17:06:27 <gensyst> yeah i've ran into unmaintained libraries in the past with useful stuff not exposed, not even in internal modules. PITA.
17:06:49 <dminuoso> otoh it really forces people onto using interfaces, it creates less breakage on updates.
17:06:58 _ht joins (~quassel@82-169-194-8.biz.kpn.net)
17:07:10 <gensyst> prefix underscores don't work for type names :S
17:07:22 <dminuoso> If you expose internal modules, people will use it. Especially nowadays, when HLS creates a low barrier for importing internal modules.
17:08:20 × cfricke quits (~cfricke@user/cfricke) (Ping timeout: 265 seconds)
17:08:29 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
17:08:44 <EvanR> then let them use it
17:08:47 <maerwald> streamly even uses the Internal module approach for modules that are not really internal, but "in flux"
17:09:06 <maerwald> so beta API, so to speak
17:09:26 <dminuoso> Does streamly otherwise pretend to follow PVP?
17:09:27 <EvanR> yeah, if everyone understands that aspect it sounds like it works well
17:09:34 <maerwald> dminuoso: I think so
17:09:44 <dminuoso> Then that's fairly misleading.
17:09:53 <gensyst> EvanR exactly, let them me use it at my own risk! imo it's great. i'm responsible then to not upgrade packages suddenly and expect everything to work 100%
17:10:01 <maerwald> dminuoso: why?
17:10:04 <dminuoso> You cant commit to PVP with minor bumps but have a brittle/constantly changing API.
17:10:04 × kristjansson_ quits (sid126207@id-126207.tinside.irccloud.com) ()
17:10:35 <maerwald> internal API is the only that changes in those cases
17:10:39 <dminuoso> This is one of those modern misbehaviors you see in software often, where software is not designed with stable APIs in mind. Ship fast and break often is the motto of this century.
17:10:39 kristjansson joins (sid126207@id-126207.tinside.irccloud.com)
17:10:52 <maerwald> it's very clearly separated
17:11:00 <dminuoso> maerwald: As you pointed out, if its not really internal, its public API.
17:11:00 <maerwald> the non-internal modules follow PVP
17:11:12 <dminuoso> Internal means not for public use.
17:11:24 <dminuoso> Not "here be dragons and PVP does not apply"
17:11:27 <maerwald> I have no problem with this approach
17:11:55 <gensyst> nothing breaks if you keep packages the same and don't run "cabal update"!
17:11:59 <gensyst> ;)
17:12:15 <dminuoso> gensyst: The entire point of PVP is that `cabal update` should not break your builds.
17:12:26 <gensyst> true lol
17:13:13 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Ping timeout: 256 seconds)
17:13:23 famubu joins (~famubu@user/famubu)
17:13:33 <dminuoso> Some packages go to extraordinary length to accomplish this. Snoyman has a cute convention of not exporting data constructors, but rather smart constructors and then individual field accessors. This lets him add new fields without causing major PVP bumps.
17:14:24 Successus joins (~Successus@gateway/tor-sasl/successus)
17:15:42 × kristjansson quits (sid126207@id-126207.tinside.irccloud.com) ()
17:16:04 <c_wraith> the problem is he exports actual record accessors, and GHC knows they're record accessors. So you can still use record update syntax with them
17:16:34 <c_wraith> the obviously should be lenses instead. Then the field doesn't even need to exist!
17:16:40 × pfurla quits (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14) (Quit: gone to sleep. ZZZzzz…)
17:16:46 <dminuoso> I dont see this as a problem
17:16:58 tromp joins (~textual@dhcp-077-249-230-040.chello.nl)
17:17:20 <c_wraith> You're stuck supporting fields that can't be changed to a better internal representation
17:17:41 <c_wraith> It only helps with adding fields, not changing ones that could be improved
17:17:56 <dminuoso> I see your point
17:18:53 <c_wraith> It's a small point. But I think worrying about changing the major version when changing an exported constructor is also a small point. :)
17:19:18 <famubu> Hi. I was trying to make a functor for a simple success/error type. The functor definition executes without error but when I try using fmap on it, ghci throws error. This is what I tried: https://paste.tomsmeding.com/lQhpXcTw
17:19:24 <famubu> What am I doing wrong here?
17:19:50 kristjansson joins (sid126207@id-126207.tinside.irccloud.com)
17:20:05 <c_wraith> did you reload the file in ghci?
17:20:33 <c_wraith> alternatively, did you remember to save your changes? Or did you save to the file that ghci has loaded?
17:20:39 <EvanR> if I want to break open the internal module of ByteString to do more efficient conversion to storable vector, then I'll take responsibility for compatibility problems dammit
17:20:40 <c_wraith> those are the most common causes for that
17:21:15 <c_wraith> ie, your code is fine. ghci just isn't aware of it, for some reason. Those three are the most common
17:21:19 <dminuoso> EvanR: Absolutely. My issue is not with breakage in internal modules, but if streamly exposes API that is *intended* for public usage, but not commits to PVP - then the entire package is not PVP compatible.
17:21:44 mcgroin joins (~mcgroin@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr)
17:22:12 <famubu> c_wraith: No I just copy pasted the code.. 😬
17:22:14 <dminuoso> Seems like a cheap excuse to not be properly PVP compatible. Either get stable APIs out, or ship them via separate packages.
17:22:32 <EvanR> if none of the api is stable, that's another issue
17:22:42 <EvanR> or it's unknown which part is stable / unstable
17:23:05 <dminuoso> Granted, if streamly explicitly names them ".Internal" module, or some such, at least there's some sort of warning.
17:23:13 <c_wraith> famubu: happens to all of us. No worries. :)
17:23:16 × MoC quits (~moc@user/moc) (Quit: Konversation terminated!)
17:24:17 × ubert quits (~Thunderbi@2a02:8109:9880:303c:31e5:443a:aa23:d51a) (Remote host closed the connection)
17:24:22 <c_wraith> famubu: or wait, did you mean there's no file at all? In that case - I recommend having a file. It's just easier to work with.
17:24:49 <geekosaur> yes, if you simply copy-pasted that into ghci then many things will go wrong
17:25:17 <geekosaur> ghci does not handle multi-line things like instance definitions at all well
17:25:47 <dminuoso> Would that explain that issue though?
17:26:14 <dminuoso> % data Result a = Okay a String | Error
17:26:14 <yahb> dminuoso:
17:26:19 <dminuoso> % instance Functor Result where
17:26:19 <yahb> dminuoso: ; <interactive>:23:10: warning: [-Wmissing-methods]; * No explicit implementation for; `fmap'; * In the instance declaration for `Functor Result'
17:26:25 <geekosaur> mm, depends. if -Werror then the empty instance definition would throw an error
17:26:37 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 240 seconds)
17:26:54 <dminuoso> Mmm, yeah I guess
17:28:10 <geekosaur> but -Werror wouldn't be the default
17:28:38 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
17:29:39 × kronicmage quits (user91577@neotame.csclub.uwaterloo.ca) (Ping timeout: 252 seconds)
17:30:12 × bollu quits (uid233390@id-233390.helmsley.irccloud.com) (Quit: Connection closed for inactivity)
17:30:33 <geekosaur> rr, actualy no you wouldn't even get that error. it'd work because fmap would be replaced by a non-Functor one specific to Result
17:30:45 <geekosaur> so no error about not finding a Functor instance
17:31:43 kronicmage joins (user55138@neotame.csclub.uwaterloo.ca)
17:33:00 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
17:33:57 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 265 seconds)
17:34:03 × boxscape_ quits (~boxscape_@p4ff0bb6c.dip0.t-ipconnect.de) (Ping timeout: 268 seconds)
17:34:20 nfd joins (~nfd@user/nfd)
17:34:37 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
17:35:41 <famubu> c_wraith: Yeah I didn't load from a file. I mean, I had a file but instead of loading with `:l` I just pasted the code into the interpreter.. 😅
17:36:39 <dsal> famubu: Did you put ghci into multi-line mode to receive the paste?
17:36:41 emf joins (~emf@2620:10d:c091:480::1:102a)
17:36:57 <famubu> Yeah multi line mode means `:{` right?
17:37:05 <dsal> Yeah
17:37:06 <famubu> That's what I used.
17:37:22 <dsal> OK. Then our guesses may have mislead us and we don't actually know what you've done.
17:38:17 × Successus quits (~Successus@gateway/tor-sasl/successus) (Remote host closed the connection)
17:38:29 Successus joins (~Successus@gateway/tor-sasl/successus)
17:39:49 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 240 seconds)
17:40:27 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
17:41:36 × mbuf quits (~Shakthi@223.178.74.194) (Quit: Leaving)
17:42:06 emf_ joins (~emf@2620:10d:c091:480::1:102a)
17:42:07 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Ping timeout: 256 seconds)
17:42:10 × thevishy quits (~Nishant@2405:201:f005:c007:a5d7:38b:39cd:e2ae) (Quit: Leaving)
17:42:53 pfurla joins (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14)
17:43:13 × emf quits (~emf@2620:10d:c091:480::1:102a) (Ping timeout: 252 seconds)
17:44:28 <famubu> My program works okay. Just had to restart ghci. I think the lines that I ran before was interfering..
17:44:32 <tom__> Am I right in saying that you should always default to newtyping everything instead of using String or Int?
17:45:02 <geekosaur> newtyping is often a good idea. I don't know that I would say "always", though
17:45:09 <famubu> Is it a bad idea to place the type of `fmap` explicitly in a functor definition?
17:45:37 × madjestic quits (~madjestic@88-159-247-120.fixed.kpn.net) (Remote host closed the connection)
17:45:38 <tom__> What is an example of a time when it would not be a good idea?
17:45:47 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 252 seconds)
17:45:48 <geekosaur> it may limit your compatibility with older versions of ghc, but otherwise I'd say it's a good sanity check on what you are doing
17:46:19 <EvanR> if you newtype an Int that would have usefully interacting with a lot of other Int APIs, now you have carple tunnel syndrome
17:46:20 × sander quits (~sander@user/sander) (Ping timeout: 252 seconds)
17:46:26 <EvanR> interacted*
17:46:30 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
17:46:37 <geekosaur> *carpal
17:46:44 <EvanR> yes
17:47:10 <tom__> So if you find yourself continually wrapping and unwrapping it
17:47:11 <EvanR> large amounts of newtype unwrapping can make the code harder to read
17:47:14 <geekosaur> and yes, newtyping Age would prevent you from adding two Ages together but would be painful in adding an Int to an Age
17:47:23 <geekosaur> or subtracting Ages to get an Int
17:47:25 × CiaoSen quits (~Jura@p200300c9570204002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 240 seconds)
17:47:55 sander joins (~sander@user/sander)
17:48:22 <famubu> When I tried `fmap :: (a -> b) -> Result a -> Result b` at https://paste.tomsmeding.com/lQhpXcTw, I got 'Illegal type signature in instance declaration. Use InstanceSigs to allow this.
17:48:26 <famubu> Found in this post https://stackoverflow.com/questions/34699716/illegal-type-signature-in-instance-declaration
17:48:43 <EvanR> that's a great error message
17:48:46 <famubu> that type signature is illegal in instance declarations
17:49:04 <EvanR> ok maybe not
17:49:16 <EvanR> makes it sound like there's something wrong with that particular sig
17:49:37 <EvanR> enable extension InstanceSigs to use it
17:50:20 tzh joins (~tzh@c-24-21-73-154.hsd1.or.comcast.net)
17:50:27 <tom__> Thanks for the answers. As usual there is no "always" in software.
17:50:31 <EvanR> or enable DeriveFunctor
17:51:03 <oats> I have a newtype wrapper over a Map so I can define my own monoid intance, is there a nice way I can still use lenses on the contained Map?
17:51:04 econo joins (uid147250@user/econo)
17:51:29 <famubu> When writing definitions do people usually use this extension? Just curious :) Writing the type makes it easier to understand.
17:51:50 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 265 seconds)
17:52:18 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
17:52:18 <geekosaur> right. I think the only reason this wants an extension is that it's not permitted in the (creaky-old) standard
17:52:49 <EvanR> you can implement the instance as a normal function somewhere else with a type sig and just name it in the instance def itself
17:52:50 <geekosaur> but as I said earlier, it's generally a good sanity check
17:53:53 <famubu> Okay. Thanks guys.
17:53:57 <EvanR> like instance Monoid [a] where mappend = concat
17:54:00 <dminuoso> famubu: I dont see it often. The primary reason I'd expect to see this, if combined with ScopedTypeVariables and either Proxy pattern or TypeApplications.
17:54:15 <oats> EvanR, are you responding to me?
17:54:22 <EvanR> nope
17:54:26 <dminuoso> That isn't to say its bad, it seems like a very benign and useful extension.
17:54:35 <EvanR> oats, what about GeneralizedNewtypeDeriving
17:54:42 yauhsien joins (~yauhsien@61-231-32-247.dynamic-ip.hinet.net)
17:54:43 <oats> I'm not familiar with it
17:54:45 oats looks
17:55:01 <EvanR> oh lens...
17:55:06 × fizbin quits (~fizbin@c-73-33-197-160.hsd1.nj.comcast.net) (Remote host closed the connection)
17:55:10 <dminuoso> Its still the correct answer.
17:55:24 <dminuoso> Use GeneralizedNewtypeDeriving to get both an Ixed and At instance
17:55:35 <dminuoso> And then you can use `at` through your newtype
17:55:49 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
17:56:08 fizbin joins (~fizbin@c-73-33-197-160.hsd1.nj.comcast.net)
17:56:10 <oats> hrm, I feel like I could've figured that out if I understood how lens works better
17:56:26 <oats> are there any good resources for understanding its implementation?
17:56:28 <dminuoso> oats: What kind of optic are you trying to construct?
17:56:37 × nfd quits (~nfd@user/nfd) (Ping timeout: 240 seconds)
17:56:41 <awpr> probably also need `type instance Index (MapNewtype k a) = k` and similarly for the value type (I forget what that type family is called)
17:56:44 <dminuoso> Traversal over a map? Or some lens `at` an value?
17:56:46 <oats> dminuoso, I'm trying to filter on the values in the map
17:57:02 nfd joins (~nfd@user/nfd)
17:57:31 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 252 seconds)
17:57:35 <dminuoso> oats: That's even simpler then
17:57:50 <geekosaur> https://en.wikibooks.org/wiki/Haskell/Lenses_and_functional_references
17:57:56 <geekosaur> oats ^
17:57:57 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
17:57:59 <dminuoso> oats: What are you using to consume the optic at the end? toListOf?
17:58:10 <oats> lengthOf
17:59:21 <dminuoso> oats: Presumably you are using `folded`?
17:59:21 × yauhsien quits (~yauhsien@61-231-32-247.dynamic-ip.hinet.net) (Ping timeout: 252 seconds)
17:59:28 <dminuoso> Or `filtered`?
17:59:55 <sm> I like that: there's no "always" in software. No "just", either.
18:00:11 <oats> lengthOf (folded . filtered (> 1))
18:00:15 <oats> my first attempt
18:00:15 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Ping timeout: 256 seconds)
18:00:38 <oats> but I'm not sure it'd filter on values, and it's definitely not getting through my newtype :P
18:00:50 <dminuoso> oats: Yeah, just get a Foldable instance on your newtype (either manually or via GND)
18:00:52 <dminuoso> That's it.
18:01:01 <dminuoso> % :t folded
18:01:02 <yahb> dminuoso: (Indexable Int p, Contravariant f1, Foldable f2, Applicative f1) => p a (f1 a) -> f2 a -> f1 (f2 a)
18:01:06 <dminuoso> uh
18:01:38 <dminuoso> So its not very obvious, but that `Foldable f2` is demanded on you.
18:01:52 wroathe joins (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net)
18:01:52 × wroathe quits (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net) (Changing host)
18:01:52 wroathe joins (~wroathe@user/wroathe)
18:01:58 <dminuoso> The optics version is more clear on this: `folded :: Foldable f => Fold (f a) a`
18:02:36 <dminuoso> % :set -XGeneralizedNewtypeDeriving
18:02:36 <yahb> dminuoso:
18:02:38 <dminuoso> % newtype List a = List { runList :: [a] }
18:02:38 <yahb> dminuoso:
18:02:54 <dminuoso> % newtype List a = List { runList :: [a] } deriving Foldable
18:02:54 <yahb> dminuoso:
18:03:14 <dminuoso> % lengthOf (folded . filtered (>1)) (List [1,2,3,4])
18:03:15 <yahb> dminuoso: 3
18:03:32 <oats> ah, I'd need to add a type param to my newtype
18:03:41 <dminuoso> For Foldable to work, yes.
18:05:18 <oats> geekosaur, thanks for the reference :)
18:06:13 cfricke joins (~cfricke@user/cfricke)
18:07:14 × FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija)))
18:07:14 finn_elija joins (~finn_elij@user/finn-elija/x-0085643)
18:07:14 finn_elija is now known as FinnElija
18:08:03 MoC joins (~moc@user/moc)
18:08:18 × curiousgay_ quits (~curiousga@77-120-141-90.kha.volia.net) (Read error: Connection reset by peer)
18:08:43 curiousgay joins (~curiousga@77-120-141-90.kha.volia.net)
18:09:56 boxscape_ joins (~boxscape_@p4ff0bb6c.dip0.t-ipconnect.de)
18:10:08 <awpr> there's always MonoFoldable if you must have a classy name for folding the map under the newtype; otherwise you can just write a traversal like `traverseMyNewtype f (MyNewtype m) = MyNewtype <$> traverse f m`
18:10:53 <awpr> (I'd expect there's a MonoFoldable version of `folded` somewhere, but perhaps not in `lens` or `mono-traversable` themselves)
18:12:51 Midjak joins (~Midjak@may53-1-78-226-116-92.fbx.proxad.net)
18:13:02 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
18:14:24 hololeap joins (~hololeap@user/hololeap)
18:16:39 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
18:17:04 × gensyst quits (gensyst@user/gensyst) (Quit: Leaving)
18:21:03 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b5e5:6571:976d:7afc) (Remote host closed the connection)
18:21:19 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:b5e5:6571:976d:7afc)
18:23:25 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 240 seconds)
18:24:37 × Techcable quits (~Techcable@168.235.93.147) (Ping timeout: 240 seconds)
18:25:17 stef204 joins (~stef204@user/stef204)
18:25:44 lavaman joins (~lavaman@98.38.249.169)
18:27:23 × tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
18:28:42 × Successus quits (~Successus@gateway/tor-sasl/successus) ()
18:29:55 <EvanR> so ghc supports many lightweight threads running "efficiently" interleaved. Does it somehow save the registers used by each thread or is everything relevant not in registers at any given suspendable moment
18:32:17 <monochrom> It saves and reloads registers, yes.
18:32:30 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b5e5:6571:976d:7afc) (Remote host closed the connection)
18:32:40 nattiestnate joins (~nate@2001:448a:20a0:4134:25e:715f:d637:5263)
18:32:55 <monochrom> Err, maybe I'm wrong.
18:33:06 <EvanR> there's a lot of registers xD
18:33:23 <monochrom> But https://github.com/takenobu-hs/haskell-ghc-illustrated is very likely to have the correct answer.
18:33:52 <dminuoso> % :t foldring
18:33:53 <yahb> dminuoso: (Contravariant f, Applicative f) => ((a -> f a -> f a) -> f a -> s -> f a) -> LensLike f s t a b
18:34:37 <monochrom> There is at least a stack pointer to save and reload.
18:34:47 <geekosaur> I think it only suspends at a yield point when it's already saved regs and jumped into the runtime?
18:35:01 × hololeap quits (~hololeap@user/hololeap) (Remote host closed the connection)
18:36:18 hololeap joins (~hololeap@user/hololeap)
18:36:26 <EvanR> nice a slideshow
18:36:27 <monochrom> There is another register for the heap pointer. This one is unproblematic. Threads share the same heap.
18:37:54 InternetCitizen joins (~fuzzypixe@ensi-libre-service-019.ensimag.fr)
18:38:36 <monochrom> Only a few registers are still relevant at suspendable moment.
18:38:37 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
18:40:24 <dminuoso> awpr: It actually works quite trivially, without MonoFoldable
18:40:29 <monochrom> GHC cleverly hijacks heap allocation points as suspendable moments. This is why very few registers are relevant at those points.
18:40:31 <dminuoso> % newtype CharMap = CharMap { runCharMap :: IM.IntMap Char }
18:40:31 <yahb> dminuoso:
18:40:39 <dminuoso> % myFoldr :: (Char -> b -> b) -> b -> CharMap -> b; myFoldr f i (CharMap m) = foldr f i m
18:40:39 <yahb> dminuoso:
18:40:45 <dminuoso> % myFolded = foldring myFoldr
18:40:46 <yahb> dminuoso:
18:40:52 <dminuoso> % toListOf (myFolded . to ord) (CharMap (IM.fromList [(1, 'a'), (2, 'c')])) -- ^ oats
18:40:52 <yahb> dminuoso: [97,99]
18:41:17 <dminuoso> awpr: So all you have to do is implement this `myFoldr` for your data type, then you can use `foldring myFoldr`
18:41:22 <oats> interesting
18:41:23 <dminuoso> Or sorry. I meant oats.
18:41:29 <oats> I ended up deriving Foldable :)
18:41:59 <awpr> sure, similar idea to wrapping the underlying `traverse`. I just mentioned `MonoFoldable` because sometimes people just _really want_ to use things from a class and can't bear the thought of a separate name
18:42:21 <dminuoso> Mono* typeclasses are only useful for people writing code polymorphic over it.
18:42:45 <awpr> personally I'd probably add the MonoX instances if in a codebase that already had a dependency on it, but definitely not add the dependency just for that
18:42:54 × nattiestnate quits (~nate@2001:448a:20a0:4134:25e:715f:d637:5263) (Quit: WeeChat 3.3)
18:43:26 <awpr> I'd definitely add a named traversal though
18:43:27 <monochrom> Hrm, I may be wrong again. At an allocation point, any number of registers may be relevant, the whole point of allocation being that there are data in registers waiting to be off-loaded into memory!
18:44:19 <EvanR> the TSO seems to have no 'register' data, and STG registers seems to be unrelated to threads
18:45:16 <EvanR> it may just be that registers are not used for what an assembly language programmer would use them for
18:45:35 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Ping timeout: 256 seconds)
18:46:22 <EvanR> they're for engine purposes and not application purposes
18:46:28 <EvanR> spitballing
18:46:47 × n3t quits (n3t@user/n3t) (Read error: Connection reset by peer)
18:48:33 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:b5e5:6571:976d:7afc)
18:49:52 kjak joins (~kjak@pool-108-45-56-21.washdc.fios.verizon.net)
18:51:16 n3t joins (n3t@s45.mydevil.net)
18:51:46 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 265 seconds)
18:56:28 hippoid joins (~hippoid@c-98-220-13-8.hsd1.il.comcast.net)
18:56:46 hippoid parts (~hippoid@c-98-220-13-8.hsd1.il.comcast.net) ()
18:57:43 × pfurla quits (~pfurla@2804:14d:5c81:4104:91cd:1543:8918:bc14) (Quit: gone to sleep. ZZZzzz…)
18:58:08 × fizbin quits (~fizbin@c-73-33-197-160.hsd1.nj.comcast.net) (Remote host closed the connection)
18:58:18 fizbin joins (~fizbin@c-73-33-197-160.hsd1.nj.comcast.net)
19:00:10 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
19:01:41 × max22- quits (~maxime@2a01cb08833598005e821d007c542121.ipv6.abo.wanadoo.fr) (Ping timeout: 252 seconds)
19:02:44 <kennyd> -
19:03:13 <[exa]> much negation.
19:07:07 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Ping timeout: 256 seconds)
19:08:03 <EvanR> so there is a timer to preempt the runtime but there's no switching threads unless it's in a state that's convenient to suspend
19:08:40 <EvanR> did see a slide that suggest it's saving "registers" in the TSO
19:08:58 wroathe joins (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net)
19:08:58 × wroathe quits (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net) (Changing host)
19:08:58 wroathe joins (~wroathe@user/wroathe)
19:11:35 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b5e5:6571:976d:7afc) (Remote host closed the connection)
19:13:01 × mcgroin quits (~mcgroin@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr) (Ping timeout: 240 seconds)
19:15:07 tromp joins (~textual@dhcp-077-249-230-040.chello.nl)
19:17:36 × MoC quits (~moc@user/moc) (Quit: Konversation terminated!)
19:18:36 <monochrom> It's very clever. The time's-up handler simply fakes a heap-full condition and let the thread run normally until it tries to allocation. >:)
19:19:04 × kmein quits (~weechat@user/kmein) (Quit: ciao kakao)
19:19:21 <EvanR> oh oh
19:19:23 kmein joins (~weechat@user/kmein)
19:19:31 <EvanR> very tricky
19:20:00 Erutuon joins (~Erutuon@user/erutuon)
19:20:32 <EvanR> so if the thread is not doing any allocation or I/O for a long time that locks up the entire runtime? or just the capability
19:20:44 <monochrom> The capability.
19:22:56 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
19:23:49 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 268 seconds)
19:24:53 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
19:27:31 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Ping timeout: 256 seconds)
19:29:01 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:b5e5:6571:976d:7afc)
19:29:33 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 252 seconds)
19:30:34 kupi joins (uid212005@id-212005.hampstead.irccloud.com)
19:31:37 × tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
19:33:37 × fizbin quits (~fizbin@c-73-33-197-160.hsd1.nj.comcast.net) (Remote host closed the connection)
19:35:07 <dminuoso> % data Foo = Foo { foo :: Int, bar :: Int }
19:35:08 <yahb> dminuoso:
19:35:17 <dminuoso> % x :: Applicative f => f Foo; x = do foo <- pure 1; let b = 1 in pure Foo{..}
19:35:17 <yahb> dminuoso: ; <interactive>:63:37: error:; * Could not deduce (Monad f) arising from a do statement; from the context: Applicative f; bound by the type signature for:; x :: forall (f :: * -> *). Applicative f => f Foo; at <interactive>:63:1-27; Possible fix:; add (Monad f) to the context of; the type signature for:; x :: forall (f :: * ->
19:35:23 <dminuoso> What is this. I cant even use let-in? :(
19:35:30 <dminuoso> I mean I can just `<- pure` my way out of this
19:35:36 <dminuoso> But this is really bizarre
19:35:39 max22- joins (~maxime@2a01cb08833598007f53408425037c9d.ipv6.abo.wanadoo.fr)
19:36:03 <dminuoso> As far as I can tell, this could be some interaction with RecordWildCards
19:36:13 <dminuoso> % x :: Applicative f => f Int; x = do foo <- pure 1; let b = 1 in pure 10
19:36:14 <yahb> dminuoso: ; <interactive>:64:37: error:; * Could not deduce (Monad f) arising from a do statement; from the context: Applicative f; bound by the type signature for:; x :: forall (f :: * -> *). Applicative f => f Int; at <interactive>:64:1-27; Possible fix:; add (Monad f) to the context of; the type signature for:; x :: forall (f :: * ->
19:36:18 <dminuoso> Mmm, no its not that either
19:36:21 <geekosaur> or just the ApplicativeDo stuff being dukmb
19:36:25 fizbin joins (~fizbin@c-73-33-197-160.hsd1.nj.comcast.net)
19:36:29 <geekosaur> I thought it only handled certain patterns
19:36:54 <dminuoso> Well it can do let-in in principle:
19:36:56 <dminuoso> % x :: Applicative f => f Foo; x = do let b = 1 in pure Foo{..}
19:36:56 <yahb> dminuoso: ; <interactive>:66:55: warning: [-Wmissing-fields]; * Fields of `Foo' not initialised: foo, bar; * In the first argument of `pure', namely `Foo {..}'; In the expression: pure Foo {..}; In a stmt of a 'do' block: let b = 1 in pure Foo {..}
19:37:30 gehmehgeh joins (~user@user/gehmehgeh)
19:37:46 <dminuoso> % x :: Applicative f => f Foo; x = do let foo = 1; bar = 1; in pure Foo{..}
19:37:46 <yahb> dminuoso:
19:38:24 <dminuoso> geekosaur: Perhaps you're right. I mean this seems like it would require more than a mechanical process.
19:38:46 <janus> what is it that is bizarre? isn't this the motivation for ApplicativeDo?
19:38:59 <dminuoso> janus: That extension is enabled.
19:39:23 <janus> ooooh ok
19:39:44 × geekosaur quits (~geekosaur@xmonad/geekosaur) (Remote host closed the connection)
19:39:52 <dminuoso> Originally I thought the monad let bindings were bad, but it seems regulat let-in force Monad back in.
19:40:36 <dminuoso> Maybe this is because in principle let bindings could refer to `a <-` type of variables?
19:40:48 <dminuoso> That would definitely thwart a mechanical translation
19:40:58 tromp joins (~textual@dhcp-077-249-230-040.chello.nl)
19:42:31 × cheater quits (~Username@user/cheater) (Ping timeout: 265 seconds)
19:42:34 geekosaur joins (~geekosaur@xmonad/geekosaur)
19:43:04 × dhouthoo quits (~dhouthoo@178-117-36-167.access.telenet.be) (Quit: WeeChat 3.3)
19:44:46 × zer0bitz quits (~zer0bitz@dsl-hkibng32-54fbfb-173.dhcp.inet.fi) (Read error: Connection reset by peer)
19:47:19 slack1256 joins (~slack1256@191.125.99.210)
19:47:35 <monochrom> "let x = e in return x" is one of the forms that the user guide names as unsupported.
19:47:49 <janus> :t do let b = 1 in pure b
19:47:50 <lambdabot> (Applicative f, Num a) => f a
19:48:35 <monochrom> OTOH, "do ..." that doesn't contain any "<-" is simply undo'ed.
19:48:37 <janus> :t do a <- pure (); let b = a in pure b
19:48:38 <lambdabot> Monad m => m ()
19:48:41 <monochrom> :t do 'a'
19:48:42 <lambdabot> Char
19:48:43 cheater joins (~Username@user/cheater)
19:49:04 <monochrom> This is known as PurityDo >:)
19:49:30 <geekosaur> :t do a <- pure (); let {b = a}; pure b
19:49:31 <lambdabot> Monad m => m ()
19:50:02 <janus> :t do let {b=()}; pure b
19:50:04 <lambdabot> Applicative f => f ()
19:50:18 <janus> so it seems to me that it is not the let forcing it to be monad, it is really the monadic bind?
19:50:50 <monochrom> :t do {let {b='a'}; b}
19:50:51 <janus> or rather, monadic bind in combination with a let afterwards?
19:50:52 <lambdabot> Char
19:50:53 <geekosaur> :t do a <- pure (); pure b
19:50:54 <lambdabot> Monad m => m Expr
19:51:10 <geekosaur> derp
19:51:11 <monochrom> do {let {b='a'}; b} is still under PurityDo
19:51:14 <geekosaur> :t do a <- pure (); pure a
19:51:15 <lambdabot> Monad m => m ()
19:51:52 <janus> but why isn't the last one applicative if my first one was?
19:52:14 <janus> does lambdabot not have ApplicativeDo ?
19:52:35 <janus> % :t do a <- pure (); pure a
19:52:36 <yahb> janus: Applicative f => f ()
19:52:47 × cosimone quits (~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20) (Remote host closed the connection)
19:52:51 <EvanR> PurityDo is a thing?
19:53:07 <monochrom> Ah lambdabot doesn't have ApplicativeDo
19:53:09 <janus> oooh ok, so i was confused. i wrote 'let..in' before, so it is PurityDo as monochrom mentions
19:53:29 <geekosaur> @let {-# Language ApplicativeDo #-}
19:53:30 <lambdabot> Defined.
19:53:30 <monochrom> PurityDo is my made-up name for Haskell2010
19:53:38 <geekosaur> :t do a <- pure (); pure a
19:53:39 <lambdabot> Monad m => m ()
19:53:45 cosimone joins (~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20)
19:54:27 <janus> % :t do let {b = 1}; pure b
19:54:27 <yahb> janus: (Applicative f, Num a) => f a
19:54:53 <janus> dminuoso: here you can see that even if using monadic let, it isn't necessarily Monad. and this is yah
19:54:56 <janus> b
19:55:49 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b5e5:6571:976d:7afc) (Remote host closed the connection)
19:55:50 <janus> s/monadic let/let in do notation (i.e. without in)/
19:57:30 yauhsien joins (~yauhsien@61-231-32-247.dynamic-ip.hinet.net)
19:58:01 <janus> let-in shouldn't mess with whether it is Applicative/Monad at all, since that syntax goes every where a pure expression goes, if I understand correctly
19:58:16 <janus> does that sound correct?
19:58:31 <geekosaur> unless the stuff that translates ApplicativeDo is dumb about it
19:58:48 <geekosaur> but "do notation" let just translates directly into let … in do
19:59:44 gehmehgeh_ joins (~user@user/gehmehgeh)
20:00:39 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
20:01:01 <janus> but if "do notation" with ApplicativeDo translated that directly, then how can it change which constraint is inferred? it seems like if i write a manual 'let..in do' it won't change the constraint
20:01:16 <monochrom> It takes more work to support "let", in particular work to explain the fine prints.
20:01:26 × retroid_ quits (~retro@97e2ba2e.skybroadband.com) (Ping timeout: 268 seconds)
20:01:30 retro_ joins (~retro@97e2ba2e.skybroadband.com)
20:01:36 × gehmehgeh quits (~user@user/gehmehgeh) (Ping timeout: 276 seconds)
20:02:29 whatsupdoc joins (uid509081@id-509081.hampstead.irccloud.com)
20:03:10 <monochrom> For example, "do x <- m; let { y = x }; z <- f y; ... " incurs Monad. "do x <- m; let { y = x }; z <- n; pure (y,z)" incurs Applicative.
20:03:36 × lagash quits (lagash@lagash.shelltalk.net) (Quit: ZNC - https://znc.in)
20:03:45 <monochrom> It is a bit of a rabbit hole to explain the difference.
20:03:49 × yauhsien quits (~yauhsien@61-231-32-247.dynamic-ip.hinet.net) (Ping timeout: 240 seconds)
20:04:16 lagash joins (lagash@lagash.shelltalk.net)
20:05:14 × juhp quits (~juhp@128.106.188.82) (Ping timeout: 265 seconds)
20:05:25 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 240 seconds)
20:05:42 <EvanR> wait what
20:05:47 <janus> % :t :t do x <- pure (); let { y = x }; z <- pure (); pure (y,z)
20:05:47 <yahb> janus: ; <interactive>:1:1: error: parse error on input `:'
20:05:52 <janus> % :t do x <- pure (); let { y = x }; z <- pure (); pure (y,z)
20:05:52 <yahb> janus: Monad f => f ((), ())
20:06:05 <janus> monochrom: isn't that similar to your second example? it infers monad, not applicative
20:06:19 <monochrom> But perhaps "let ... in pure E" as the very last clause should be supported and it is easy to check.
20:06:45 <dsal> I'm slightly confused about how thunks resolve. If I have a lazy map, can I force it to WHNF?
20:06:46 juhp joins (~juhp@128.106.188.82)
20:06:53 <dsal> er, can I force a value inside of it.
20:07:03 <monochrom> I was saying, if "let" were to be supported, then someone would have to write an algorithm that could tell the difference, and also write the user guide.
20:07:10 <geekosaur> there is no lazy Map as such
20:07:11 <dsal> i.e., I want to ask for a value twice and do the work once.
20:07:28 <geekosaur> the operations are lazy or strict, the Map itself is the same in either case
20:07:37 <geekosaur> so you can force values as you wish
20:08:27 × lagash quits (lagash@lagash.shelltalk.net) (Client Quit)
20:08:34 <dsal> geekosaur: Yeah, I kind of understand that, just not quite sure how to think about whether I can resolve a value and have it stay in the map.
20:08:35 <geekosaur> (and iirc is spine-strict regardless)
20:08:48 lagash joins (lagash@lagash.shelltalk.net)
20:09:06 <janus> monochrom: ok, so when you said "incur" you mean what the typechecker should ideally infer, not what it actually does?
20:09:15 <monochrom> Right.
20:09:55 <dsal> Data.Map.Strict.lookup doesn't seem to care about whether the value itself has been evaluated, so it doesn't seem to happen *there*.
20:10:41 <geekosaur> right, using the resulting value would force it, why would that remove it from the Map? it should simply be already evaluated at that point
20:10:53 <monochrom> Yes you can resolve a value and it stays in the map.
20:11:01 × notzmv quits (~zmv@user/notzmv) (Ping timeout: 240 seconds)
20:11:19 <dsal> I'm thinking about my local binding as being resolved, but that wouldn't necessarily resolve the value in the map, would it?
20:11:21 <monochrom> Including the memoization you have in mind.
20:11:29 <dsal> i.e., if I asked for the same value again, it'd do the work again, right?
20:11:42 <janus> ok i guess i understand why there was so much contention around ApplicativeDo in the survey. it sounds great but seems to be problematic in practise
20:11:49 <geekosaur> why wouldn't it? under the hood it gives you a pointer to the value inside the Map
20:11:56 <geekosaur> purity means this is safe
20:12:21 <dsal> Sure, I know that it *can* do that, I just don't know what it *will* do or what I should assume will happen.
20:12:41 <geekosaur> lookup would have to do extra work for that not to happen
20:13:06 <dsal> It's not obvious to me that `!a = b` would affect b.
20:13:07 <geekosaur> it would have to specifically copy the value itself, which is not particularly easy
20:13:55 <monochrom> This is why byorgey says to use Data.Map for dynamic programming.
20:14:16 <dsal> OK, so it sounds like I actually get the reference that's in the map. That part wasn't clear to me. I guess I was thinking I'd have another thunk somehow.
20:15:16 dschrempf joins (~dominik@070-207.dynamic.dsl.fonira.net)
20:15:43 <geekosaur> that again would require it to do more work
20:16:04 <geekosaur> the obvious implementations of lookup would simply produce the reference in the map
20:16:45 <dsal> I'm not exactly sure how. My mental model assumed it would just copy the box that includes either the value or the thunk.
20:17:32 × lagash quits (lagash@lagash.shelltalk.net) (Quit: ZNC - https://znc.in)
20:18:32 <monochrom> "It's pointers all the way down."
20:19:26 <dsal> It's nice that I can assume it'd do the thing that's helpful, I guess. :)
20:19:48 <geekosaur> that's kinda the point of haskell being pure
20:20:04 <monochrom> If you do a "Map.insert k 5 d", a heap object containing 5 is created on the heap, a pointer to that heap object is store in your dictionary.
20:20:19 <monochrom> If you do a lookup, you get that pointer.
20:20:44 <dsal> Well that sounds simple.
20:21:15 <dsal> Every time I think something is complicated, it ends up I'm just dumb and things are more simple than I expected.
20:21:18 <monochrom> If you use a debugger to change that 5 to 6 behind your back, then do a lookup, you get that pointer but now it points to 6.
20:21:46 ftzm joins (~ftzm@085081036237.dynamic.telenor.dk)
20:22:44 burnsidesLlama joins (~burnsides@dhcp168-017.wadham.ox.ac.uk)
20:22:47 × kmein quits (~weechat@user/kmein) (Quit: ciao kakao)
20:23:04 kmein joins (~weechat@user/kmein)
20:23:15 <monochrom> This is why Haskell is not ready for space travel. Too much cosmic rays that ruin the referential transparency.
20:23:45 <monochrom> C fare much better because you just have to say "volatile int x". >:)
20:25:56 × kmein quits (~weechat@user/kmein) (Client Quit)
20:26:15 kmein joins (~weechat@user/kmein)
20:26:56 × famubu quits (~famubu@user/famubu) (Remote host closed the connection)
20:27:53 <nfd> i think our guidance systems are going to continue to look the same way they've looked since the 80s, until they can't source the parts from all the vendors
20:28:12 <nfd> like... radiation-hardened pacemakers
20:28:26 × burnsidesLlama quits (~burnsides@dhcp168-017.wadham.ox.ac.uk) (Ping timeout: 265 seconds)
20:28:57 × xff0x quits (~xff0x@port-92-193-200-89.dynamic.as20676.net) (Ping timeout: 252 seconds)
20:29:12 lagash joins (lagash@lagash.shelltalk.net)
20:29:19 × raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 252 seconds)
20:31:51 Techcable joins (~Techcable@168.235.93.147)
20:32:09 × ftzm quits (~ftzm@085081036237.dynamic.telenor.dk) (Quit: Client closed)
20:32:47 × deadmarshal quits (~deadmarsh@95.38.118.214) (Ping timeout: 265 seconds)
20:34:54 <nfd> (and, of course, if you're using `volatile` to do much other than device memory mapping/some very particular synchronization stuff, You're Doing It Wrong. computer systems for space travel actually use two different guidance systems from different vendors, cleanroom separated in their development, tied to the same clock, and then the results are checked for agreement. if one chip's wrong, they turn it off
20:35:00 <nfd> and keep flying with the rest. or at least this is what i recall from my concurrency class in uni)
20:35:55 <EvanR> ah the byzantine dynamic duo problem
20:36:29 × gehmehgeh_ quits (~user@user/gehmehgeh) (Remote host closed the connection)
20:36:37 × cfricke quits (~cfricke@user/cfricke) (Quit: WeeChat 3.3)
20:36:39 <nfd> so i guess haskell *could* be ready for space travel in one of the HDL/embedded behavior-style DSLs, in principle. you're gonna use a supervisor anyway :D
20:36:50 × xacktm quits (xacktm@user/xacktm) (Ping timeout: 252 seconds)
20:36:59 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:b5e5:6571:976d:7afc)
20:37:08 gehmehgeh_ joins (~user@user/gehmehgeh)
20:37:14 <monochrom> I was joking!
20:37:20 <nfd> small systems like that shouldn't be messing with stuff like heaps when there's strict realtime constraints so your joke wasn't wrong
20:37:29 × dschrempf quits (~dominik@070-207.dynamic.dsl.fonira.net) (Quit: WeeChat 3.3)
20:38:12 <geekosaur> there is at least one haskell compiler that would work well for such systems (jhc)
20:38:28 <dsal> Apparently haskell is used for Tesla car stuff.
20:38:35 <dsal> Just not the runtime.
20:39:25 × andreas303 quits (andreas303@ip227.orange.bnc4free.com) (Quit: fBNC - https://bnc4free.com)
20:39:33 <geekosaur> there's a fair amount of haskell *producing* runtimes via clash or atm or etc.
20:39:41 <nfd> Hume hasn't seen any attention for a while iirc but it seemed like a fun concept to me
20:39:51 <geekosaur> *atom
20:48:31 bollu joins (uid233390@id-233390.helmsley.irccloud.com)
20:51:25 xff0x joins (~xff0x@2001:1a81:52ad:7f00:863f:6855:4758:14df)
20:52:42 <oats> yay day 5 https://github.com/oatberry/aoc2021-haskell/blob/main/src/Day5.hs
20:53:18 <oats> not very fast, takes about a second on my system
20:53:46 <oats> I still don't really have a great sense for predicting performance of my haskel lcode
20:53:51 <tomsmeding> should have used an array
20:53:52 <EvanR> I macguyvered some pretty click bingo parsers using only a basic split
20:54:05 <tomsmeding> https://git.tomsmeding.com/AOC/tree/2021/5.hs 31ms on my system
20:54:06 Pickchea joins (~private@user/pickchea)
20:54:16 <EvanR> yeah vector rocks
20:54:18 <tomsmeding> (code quality is less though :p )
20:54:32 <oats> tomsmeding, ah yeh, I didn't take into consideration that it might be bounded-size
20:54:33 <EvanR> when switching from list to vector I didn't really have to change much
20:54:37 <oats> the diagram
20:54:59 × user01 quits (~aj@154.0.137.32) (Quit: Leaving.)
20:55:00 slac85734 joins (~slack1256@191.125.99.72)
20:55:04 <tomsmeding> oats: I just made the array from minimum coordinates through maximum coordinates, after observing that the numbers weren't _too_ far out
20:55:54 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b5e5:6571:976d:7afc) (Remote host closed the connection)
20:56:08 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:b5e5:6571:976d:7afc)
20:57:01 × slack1256 quits (~slack1256@191.125.99.210) (Ping timeout: 240 seconds)
20:57:23 × x88x88x quits (~x88x88x@149.28.53.172) (Remote host closed the connection)
20:57:43 x88x88x joins (~x88x88x@149.28.53.172)
20:58:15 × x88x88x quits (~x88x88x@149.28.53.172) (Remote host closed the connection)
20:59:00 vicfred joins (~vicfred@user/vicfred)
21:00:14 <kennyd> this is some cool shit.. self learning table tennis robot https://www.youtube.com/watch?v=u3L8vGMDYD8
21:00:41 <dsal> oats: We have some big inputs. I'm doing 5ms on one the larger ones.
21:00:50 <dminuoso> monochrom: Ah thanks for the pointers.
21:00:52 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
21:01:05 × InternetCitizen quits (~fuzzypixe@ensi-libre-service-019.ensimag.fr) (Ping timeout: 256 seconds)
21:01:14 <dsal> oats: want to learn a couple new weird things? :)
21:01:30 <oats> dsal, hell yeah, do your worst
21:01:36 × _ht quits (~quassel@82-169-194-8.biz.kpn.net) (Remote host closed the connection)
21:01:54 <dsal> oats: So, the big inputs are here: https://the-tk.com/project/aoc2021-bigboys.html
21:01:54 <dminuoso> I guess at the end I can use `<- pure` as a poor mans let-binding in ApplicativeDo
21:02:48 <oats> dsal, haha, this is great
21:02:48 mcgroin joins (~mcgroin@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr)
21:03:17 x88x88x joins (~x88x88x@2001:19f0:5:39a8:5400:3ff:feb6:73cb)
21:03:23 <dsal> Oh no, I lost my benches for the big ones...
21:04:15 <EvanR> this is funny and spoilery for day 7
21:04:33 <EvanR> the right location for part 1 is the median and part 2 is average?
21:04:43 andreas303 joins (andreas303@ip227.orange.bnc4free.com)
21:05:00 xacktm joins (xacktm@user/xacktm)
21:05:33 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Ping timeout: 256 seconds)
21:06:18 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b5e5:6571:976d:7afc) (Remote host closed the connection)
21:06:21 <EvanR> lies damn lies and statistics
21:06:27 <dsal> EvanR: approximately, yeah.
21:06:49 acidjnk_new joins (~acidjnk@p200300d0c7271e23ace56c846c004ca7.dip0.t-ipconnect.de)
21:06:50 <juri_> where do unit tests come in on that benchmark?
21:07:02 <dsal> oats: Never mind, I'm off by a couple orders of magnitude. The 20k is taking me 3-4s not ms.
21:07:21 <oats> hehe
21:07:27 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
21:08:19 <dsal> Anyway, a couple interesting things: One: I made my input a functor which I parse into an `Input [(Point, Point)]` and then expand that into an `Input [Int]` where the points are completely flattened.
21:08:29 <dsal> There are two very different algorithms for solving this. I'm still discussing the dumb one.
21:09:08 <dsal> So, first neat thing: If you have an arbitrary bounded thing, you can bidirectionally map it to Int pretty easily with Data.Ix
21:10:27 <dsal> This is how stuff like Array works. But it gives you a thing that's a lot easier to think about indexing. It's just 0-N instead of (x,y) - (x',y').
21:10:53 <dsal> The first thing I did was put that in an IntMap. Then I just got rid of the IntMap.
21:11:31 <dsal> The question degrades to "how many duplicate numbers are in this list?"
21:13:17 <dsal> I did that by just sorting them and counting how often the same thing occurs more than once (approximately (length . filter ((> 0) . length) . group . sort), though my "obviously better" version isn't actually that much faster).
21:13:26 <dsal> Next up: Do it without sorting at all.
21:13:39 InternetCitizen joins (~fuzzypixe@eth-west-pareq2-46-193-4-100.wb.wifirst.net)
21:14:17 LiaoTao joins (~LiaoTao@gateway/tor-sasl/liaotao)
21:15:26 <dsal> If you want to go hard, you can do it without expanding all of the points. The largest input would require more than a computer's worth of RAM to remember all the points on all the lines.
21:28:37 × lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection)
21:28:54 eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:b5e5:6571:976d:7afc)
21:31:36 jkaye joins (~jkaye@2601:281:8300:7530:6e92:54cb:12e7:3fa1)
21:32:22 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
21:35:05 × fizbin quits (~fizbin@c-73-33-197-160.hsd1.nj.comcast.net) (Remote host closed the connection)
21:35:33 fizbin joins (~fizbin@c-73-33-197-160.hsd1.nj.comcast.net)
21:35:57 <oats> maybe I'll give it a shot in the far future lol
21:36:05 <oats> it's a lot to take in
21:37:42 jgeerds joins (~jgeerds@55d4ac73.access.ecotel.net)
21:39:21 wroathe joins (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net)
21:39:21 × wroathe quits (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net) (Changing host)
21:39:21 wroathe joins (~wroathe@user/wroathe)
21:39:43 × fizbin quits (~fizbin@c-73-33-197-160.hsd1.nj.comcast.net) (Ping timeout: 252 seconds)
21:40:27 × merijn quits (~merijn@83-160-49-249.ip.xs4all.nl) (Ping timeout: 252 seconds)
21:40:47 senoraraton joins (~senorarat@192-195-83-130.static.monkeybrains.net)
21:42:23 × n3t quits (n3t@s45.mydevil.net) (Changing host)
21:42:23 n3t joins (n3t@user/n3t)
21:44:44 <dsal> Ix makes it pretty easy to use ST as well. :)
21:46:23 × tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
21:46:57 × x88x88x quits (~x88x88x@2001:19f0:5:39a8:5400:3ff:feb6:73cb) (Remote host closed the connection)
21:47:12 <EvanR> apparently the sort is the slowest part and so vector algorithms destroys that question
21:48:03 x88x88x joins (~x88x88x@149.28.53.172)
21:49:11 tromp joins (~textual@dhcp-077-249-230-040.chello.nl)
21:49:40 × x88x88x quits (~x88x88x@149.28.53.172) (Remote host closed the connection)
21:50:37 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 240 seconds)
21:50:52 × curiousgay quits (~curiousga@77-120-141-90.kha.volia.net) (Remote host closed the connection)
21:51:19 curiousgay joins (~curiousga@77-120-141-90.kha.volia.net)
21:51:45 x88x88x joins (~x88x88x@2001:19f0:5:39a8:5400:3ff:feb6:73cb)
21:52:54 lavaman joins (~lavaman@98.38.249.169)
21:55:01 burnsidesLlama joins (~burnsides@dhcp168-017.wadham.ox.ac.uk)
21:56:28 × burnsidesLlama quits (~burnsides@dhcp168-017.wadham.ox.ac.uk) (Remote host closed the connection)
21:57:22 burnsidesLlama joins (~burnsides@dhcp168-017.wadham.ox.ac.uk)
21:57:36 × burnsidesLlama quits (~burnsides@dhcp168-017.wadham.ox.ac.uk) (Remote host closed the connection)
21:58:05 burnsidesLlama joins (~burnsides@dhcp168-017.wadham.ox.ac.uk)
21:59:04 × Morrow quits (~quassel@bzq-110-168-31-106.red.bezeqint.net) (Remote host closed the connection)
22:00:08 Morrow joins (~quassel@bzq-110-168-31-106.red.bezeqint.net)
22:00:16 × mcgroin quits (~mcgroin@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr) (Ping timeout: 265 seconds)
22:02:41 × burnsidesLlama quits (~burnsides@dhcp168-017.wadham.ox.ac.uk) (Ping timeout: 265 seconds)
22:03:10 × eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b5e5:6571:976d:7afc) (Remote host closed the connection)
22:03:12 raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net)
22:05:01 × Erutuon quits (~Erutuon@user/erutuon) (Ping timeout: 240 seconds)
22:07:16 wroathe joins (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net)
22:07:16 × wroathe quits (~wroathe@c-68-54-25-135.hsd1.mn.comcast.net) (Changing host)
22:07:16 wroathe joins (~wroathe@user/wroathe)
22:08:59 Widget joins (~widget@2a04:ee41:6:70cd:e189:3667:bb4:f6ac)
22:10:19 × kupi quits (uid212005@id-212005.hampstead.irccloud.com) (Quit: Connection closed for inactivity)
22:11:25 × wroathe quits (~wroathe@user/wroathe) (Ping timeout: 240 seconds)
22:15:12 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
22:15:28 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
22:15:50 <maerwald> is there an Either with a 3rd constructor?
22:16:17 <[exa]> Left, Center, Right?
22:16:21 <dminuoso> Do you mean These?
22:16:24 <maerwald> no, not These
22:16:28 <maerwald> that has different meaning
22:16:32 <maerwald> [exa]: yeah
22:16:34 <dminuoso> I dont know what meaning you are looking for
22:17:10 <maerwald> These has 2 type variables
22:17:17 × takuan quits (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection)
22:17:32 <maerwald> I want 3
22:17:45 <dminuoso> You didn't state that in the initial question. :P
22:17:50 <[exa]> maerwald: so Center should be "neutral middle choice that acts as a kinda default when nothing interesting happened" right?
22:17:55 <maerwald> dminuoso: it's more mysterious that way
22:18:04 <[exa]> s/right/checks/ :D
22:18:08 <dminuoso> maerwald: Okay. Then the answer is yes.
22:18:18 <slac85734> I want to corroborate something about the LLVM backend on linux. It seems to me that when using the `-fllvm` option, we compile with `llc` but we link with the gnu linker. Is that right?
22:18:22 <maerwald> [exa]: not sure... I have 3 alternatives and am too lazy to think up names that make sense
22:18:23 <dminuoso> For mystery reasons I will keep details to myself.
22:18:23 slac85734 is now known as slack1256
22:18:28 <dminuoso> :o)
22:18:31 <[exa]> maerwald: jain logic?
22:18:42 <maerwald> it's a mystery, really
22:19:49 <[exa]> maerwald: would it be isomorphic to`Either (Either l r) center` ?
22:19:53 <AndreasK> slack1256: Doesn't ghc use the gold linker by now on linux?
22:20:08 <hpc> maerwald: just write your dependent sum on Ordering instead of Bool :D
22:20:20 <maerwald> [exa]: obviously
22:20:29 <[exa]> hpc: +1
22:20:59 × senoraraton quits (~senorarat@192-195-83-130.static.monkeybrains.net) (Ping timeout: 256 seconds)
22:21:00 <slack1256> AndreasK: Right. The gold linker is included in binutils thought.
22:21:15 <slack1256> But on MacOs it should use the LLVM linker right?
22:21:17 notzmv joins (~zmv@user/notzmv)
22:21:25 <AndreasK> slack1256: You can check what exactly is invoked by passing -v to ghc iirc
22:21:29 <hpc> one of these days i want to write a type-level math package where 2 = Bool, 3 = Ordering, 4 = IOMode, etc
22:21:54 <slack1256> AndreasK: :-O
22:21:55 <geekosaur> it uses the mach-o linker, I believe
22:22:21 <geekosaur> are you looking for something in particular?
22:23:17 × michalz quits (~michalz@185.246.204.62) (Remote host closed the connection)
22:23:32 <slack1256> Yeah. On the company I work a partner uses an M1 macbook and he is having problems compiling our project.
22:24:05 <slack1256> He uses the llvm backend but gets an error like: `pixura-indexer> [ 4 of 72] Compiling Pixura.Indexer.Index
22:24:08 <slack1256> pixura-indexer> <command line>: dlopen(/Users/koloz/Documents/superrare/repos/pixura-backend/.stack-work/install/x86_64-osx/25cc8bfe483a5d26226136b4f70e481c7477be16d3f0d6d7c8837fd6cbc8e641/8.10.7/lib/x86_64-osx-ghc-8.10.7/libHSpixura-models-0.1.0.0-85icpJLsgeHGfI1Ygzp720-ghc8.10.7.dylib, 0x0005): symbol not found in flat namespace '_rarestzmcontractszm0zi1zi0zi0zmKX2iXgyAgAwAOvKj5Nv0rzz_RarestContractsziContractsziSuperRareBazzaar_zdfToJSONAuctionBidzu
22:24:08 <slack1256> zdctoJSON_closure'.
22:24:35 <slack1256> That looked like an linker issue to me!
22:24:41 <janus> hpc: isn't that just `Vec n Unit` ?
22:24:50 <slack1256> Sorry for the warped paste.
22:25:06 mvk joins (~mvk@2607:fea8:5cdd:f000::9788)
22:25:15 <janus> :P
22:25:21 <geekosaur> that's the dynamic linker built into the bytecode backend, failing to load a shared object needed for Template Haskell
22:25:24 <hpc> janus: yes, but not as awesome
22:25:31 <hpc> don't forget i am the author of acme-php :D
22:26:00 <geekosaur> not using either gold nor lld nor MacOS ld
22:26:21 <geekosaur> "dlopen" is the key here
22:26:31 <slack1256> :-O That is weird!
22:27:33 <slack1256> It seems his machine is case insensitive. That can be it.
22:28:11 × tromp quits (~textual@dhcp-077-249-230-040.chello.nl) (Quit: My iMac has gone to sleep. ZZZzzz…)
22:28:13 <geekosaur> hr. thought Apple refused to support case-insensitive installs these days
22:28:28 <geekosaur> (since 10.3 or thenabouts)
22:29:36 <raehik> Can I write/export a "kind synonym"? I have Type1 and Type2 which are both TypeLikes in their kind signature, and I want to ease referring to TypeLikes
22:30:10 <raehik> I tried standalone kind sigs, but I misunderstood its use -- it's for defining the kind of an accompanying type. not a sort of reusable synonym
22:31:05 <geekosaur> I think you need ConstraintKinds to do that?
22:32:29 <yin> why am i geting an error on a simple [MyCustomDataConstructor..AnotherAndYesIDerivedEnum]
22:32:45 <raehik> geekosaur: yes that looks likely by a glance. looking at how I could use it
22:32:59 <geekosaur> because it's parsed as (MyCustomDataConstructor..)
22:33:04 <geekosaur> use spaces
22:33:13 <yin> oh no
22:33:24 <geekosaur> (that is, it's looking for operator . in package MyCustomDataConstructor)
22:33:41 <yin> i hate dot syntaxes :(
22:33:47 <yin> thank you
22:33:49 <yin> my bad
22:34:21 <raehik> wait actually, I *was* just writing a type synonym! lol
22:34:46 <raehik> ConstraintKinds would solve a similar problem tho
22:35:18 <geekosaur> I think it enables type synonym syntax to also represent kind synonyms
22:35:39 × stef204 quits (~stef204@user/stef204) (Quit: WeeChat 3.3)
22:37:49 <raehik> I'm probably mixing up my terminology. I did type TypeLike = A -> B -> C and can use it like `class UseTypeLike (a :: TypeLike) ...` :)
22:39:55 <geekosaur> the first is the one I think needs ConstraintKinds; the second I think is KindSignatures
22:40:39 <raehik> haha I can't tell, I have KindSigs on by default but not ConstraintKinds buuut it's probably implied by my 20 defaults.
22:41:04 jakalx parts (~jakalx@base.jakalx.net) (Error from remote client)
22:41:35 jakalx joins (~jakalx@base.jakalx.net)
22:46:41 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
22:46:59 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
22:48:39 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
22:48:57 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
22:49:15 × gehmehgeh_ quits (~user@user/gehmehgeh) (Quit: Leaving)
22:50:55 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
22:51:13 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
22:52:53 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
22:53:11 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
22:54:46 eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net)
22:57:54 sciencentistguy joins (~sciencent@hacksoc/ordinary-member)
22:59:57 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
23:00:13 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
23:03:10 <monochrom> dminuoso: Some users of ApplicativeDo use the ugly trick of "pure (let y=x+1 etc in ...)". Maybe you won't mind it as a compromise.
23:03:14 × mc47 quits (~mc47@xmonad/TheMC47) (Remote host closed the connection)
23:03:44 <dminuoso> monochrom: Oh, that will work? o.o
23:03:53 <dminuoso> I definitely wont mind. Thanks for the tip
23:04:11 Sgeo joins (~Sgeo@user/sgeo)
23:04:14 × juri_ quits (~juri@178.63.35.222) (Ping timeout: 252 seconds)
23:04:35 <monochrom> It is a bit ugly, especially considering the dilemma of how to even layout multiple bindings in the first place.
23:05:31 × bollu quits (uid233390@id-233390.helmsley.irccloud.com) (Quit: Connection closed for inactivity)
23:07:12 × max22- quits (~maxime@2a01cb08833598007f53408425037c9d.ipv6.abo.wanadoo.fr) (Quit: Leaving)
23:08:45 burnsidesLlama joins (~burnsides@dhcp168-017.wadham.ox.ac.uk)
23:09:20 × Midjak quits (~Midjak@may53-1-78-226-116-92.fbx.proxad.net) (Quit: This computer has gone to sleep)
23:09:48 × Tuplanolla quits (~Tuplanoll@91-159-69-50.elisa-laajakaista.fi) (Quit: Leaving.)
23:11:20 × img quits (~img@user/img) (Quit: ZNC 1.8.2 - https://znc.in)
23:12:32 <dminuoso> Since I frequently layout like that, it seems fine with me
23:12:50 img joins (~img@user/img)
23:13:06 × shriekingnoise quits (~shrieking@186.137.144.80) (Quit: Quit)
23:14:15 × burnsidesLlama quits (~burnsides@dhcp168-017.wadham.ox.ac.uk) (Ping timeout: 256 seconds)
23:14:21 × img quits (~img@user/img) (Client Quit)
23:14:36 × Morrow quits (~quassel@bzq-110-168-31-106.red.bezeqint.net) (Quit: https://quassel-irc.org - Chat comfortably. Anywhere.)
23:15:48 img joins (~img@user/img)
23:17:24 <Axman6> edwardk: I made a thing which allows you do use discrimination with generics-sop, and wondered if there was a better way to do this: https://paste.tomsmeding.com/jovB7kDq. I know it's redundant given the current implementation's GHC.Generics support, but fun nonetheless, and might end up being faster if https://github.com/well-typed/generics-sop/pull/129 ever gets merged. I'm mostly wondering if there's a way to avoid the Maybe in the SmallArray (Maybe (m (b -
23:17:24 <Axman6> > m ())))
23:17:26 <lambdabot> <hint>:1:5: error: parse error on input ‘)’
23:17:58 <Axman6> ... did that message get split right at the '>'?
23:18:57 <geekosaur> yep
23:19:05 <Axman6> That's amazing
23:20:04 <Axman6> glguy: how hard do you thnk it would be for glirc to highlight where messages would be split while typing? not a super useful feature, but kinda fun
23:20:50 <glguy> I guess we just need to decide what it would look like
23:20:58 <glguy> the message splitting happens pretty late in the pipeline
23:21:22 <glguy> so we'd need to get the information needed up into the textbox renderer
23:22:23 <Axman6> how is that length decided? is it a protocol thing, a server setting?
23:22:59 <glguy> The protocol says messages can be 512 bytes long. So you have to consider UTF-8 encoding, your nickname, username, and hostname, the channel you're sending to
23:23:20 <Axman6> hmm, interesting, yeah that is a little more difficult
23:24:07 <glguy> so there's some code in there to avoid splitting in the middle of a UTF-8 encoded codepoint and some stuff to track what the client things your username, nickname, and hostname are
23:24:31 <dminuoso> glguy: By the way, is there a reason you chose `*` over `-` for config-value?
23:24:48 <dminuoso> In some way, `-` would have been nice because that would have enabled various YAML tooling to smoothly interoperate with it.
23:25:14 <dminuoso> Say YAML-based syntax highlighting, or even using `yq`
23:25:16 <glguy> YAML's horible treatment of strings would make it a bit fussy to use across
23:25:33 <janus> where can 'where' blocks go? does it change with BlockArguments?
23:25:36 <dminuoso> Well, it seems at first glance with `-` any config-value file would at least be valid YAML
23:25:39 <dminuoso> Nothing more
23:25:49 <glguy> I don't remember if there was a reason for picking one over the other at this point
23:26:27 <geekosaur> janus, at the end of any declaration: "module", "class", "instance", function definition equation, etc.
23:26:35 <geekosaur> BlockArguments does not affect this
23:26:51 <glguy> I use -- for comments (a la Haskell) so maybe at the time I was trying to be sufficiently distinct from that?
23:27:00 <janus> geekosaur: but what is the motivation for now allowing it anywhere let..in can go?
23:27:00 <glguy> otherwise there's probably not any particular reason
23:27:29 <geekosaur> janus, so it can scope over guards in a function/equation definition
23:27:31 × darchitect quits (~darchitec@2a00:23c6:3584:df00:7dec:bf13:8fa:748c) (Ping timeout: 252 seconds)
23:27:47 <glguy> dminuoso: I have syntax highlighting for Vim, at least :) (no I don't think that resolves your issue)
23:27:49 × curiousgay quits (~curiousga@77-120-141-90.kha.volia.net) (Ping timeout: 240 seconds)
23:29:10 <geekosaur> also so it is consistent with all other uses of "where"
23:29:13 yauhsien joins (~yauhsien@61-231-32-247.dynamic-ip.hinet.net)
23:29:35 <dminuoso> Would alex/happy allow for parametrizing over a token, such that a user could customize it with some kind of `parseWithOpts (defaultOpts { listChar = '-' })?
23:30:01 <dminuoso> Im completely unfamiliar with these tools, so I wouldn't even know where to look
23:30:23 <glguy> dminuoso: ehh, I not really, but what you can do is like what GHC does, parse everything and then reject some stuff later
23:30:45 <glguy> making bare - lex the same way as * , or as an alt* token and putting that in the parser would work
23:31:08 <oats> aha, I found the magic data structure to make Day 6 veryfast. multiset \o/
23:31:27 <glguy> I don't mind supporting both styles at the same time; i'd want to think about it for a moment to decide that I wasn't boxing myself out of some other use of - later
23:31:47 <glguy> I think some markdowns support more than one list element delimiter
23:31:54 <dminuoso> glguy: So if I was to bolt this on, a separate token seems more useful, as we could have a backwards compatible mode and let the user simply decide which style they want
23:32:18 <dsal> oats: Is taht faster than an IntSet?
23:32:30 <dsal> Er, IntMap
23:32:31 <dminuoso> Though this is edge case thinking, it seems at worst we would just suddenly enable parsing previously invalid config files
23:32:33 <glguy> dminuoso: are you using config-value for something already?
23:32:41 <oats> dsal, no idea, I'd have to try
23:32:41 <dminuoso> glguy: Im using config-schema everywhere! :)
23:33:41 <dminuoso> Each tool comes with a `config-help` optparse applicative command, giving you interactive and always-up-to-date configuration documentation.
23:34:02 × yauhsien quits (~yauhsien@61-231-32-247.dynamic-ip.hinet.net) (Ping timeout: 265 seconds)
23:34:19 <glguy> What's that do with optparse applicative?
23:34:31 × cosimone quits (~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20) (Ping timeout: 265 seconds)
23:35:21 <dminuoso> Nothing really, Im just saying that each command line tool that takes a config also has some mode where it prints out the result of generateDocs
23:35:27 <dminuoso> Which is the main selling point to me.
23:35:37 <dminuoso> Tools that document their configuration themselves
23:35:52 <dminuoso> No need to keep some CONFIG.md up-to-date with my code
23:36:00 <glguy> yeah, having glirc being able to tell me all of its configuration fields is important to me remembering how to use it
23:36:28 <glguy> way better than hoping I can remember what smart name I used for everything the first time
23:36:34 <dminuoso> Indeed. :)
23:36:53 senoraraton joins (~senorarat@192-195-83-130.static.monkeybrains.net)
23:36:55 burnsidesLlama joins (~burnsides@dhcp168-017.wadham.ox.ac.uk)
23:37:18 <dminuoso> And I find humans are terrible at keeping this kind of documentation up to date, so over time you get drift and typos
23:37:32 × eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection)
23:37:39 merijn joins (~merijn@83-160-49-249.ip.xs4all.nl)
23:38:40 <oats> dsal, `IntMultiSet` is just an `IntMap Int` under the hood lol
23:38:47 <oats> just with some convenience functions on top
23:39:16 <dsal> Oh I see. Yeah.
23:39:49 <dminuoso> glguy: Ah by the way, it seems that adding a hyphen would disallow it being inside an atom.
23:39:55 <dminuoso> Mmm.
23:39:55 Sgeo_ joins (~Sgeo@user/sgeo)
23:40:04 <glguy> err, why?
23:40:29 <glguy> atoms never start with -
23:40:31 <dsal> oats: My breeder is just this: https://www.irccloud.com/pastebin/eYZijgwl/breed.hs
23:40:51 <dminuoso> Ahh I misread
23:41:05 <dminuoso> glguy: If you're in principle happy with the idea, Ill make the necessary PR
23:41:14 <glguy> negative numbers can start with -, but they have to have more than just a bare -
23:41:57 <oats> dsal, https://github.com/oatberry/aoc2021-haskell/blob/main/src/Day6.hs
23:42:23 <oats> I tried, like, all the listy monads hoping one would be performant :P
23:42:35 × Sgeo quits (~Sgeo@user/sgeo) (Ping timeout: 256 seconds)
23:43:02 <dsal> oats: well that's nice
23:43:06 <glguy> dminuoso: I think I'd be OK with just adding this line below line 68: "-" { token_ Bullet }
23:43:20 <oats> I thought so too 😊
23:43:25 × xff0x quits (~xff0x@2001:1a81:52ad:7f00:863f:6855:4758:14df) (Ping timeout: 240 seconds)
23:44:24 <dminuoso> glguy: My thinking is it's nice to have no ambiguous syntax. It might look odd if `- foo\n* bar\n- quux` was permisseable.
23:44:37 xff0x joins (~xff0x@2001:1a81:52ad:7f00:65a:88aa:1a84:9da4)
23:44:58 <dminuoso> Plus, if we tokenize it as a separate character, we can defer the choice to the user.
23:45:01 <glguy> dminuoso: to me "ambiguous syntax" means there are multiple interpretations
23:45:07 × xkuru quits (~xkuru@user/xkuru) (Read error: Connection reset by peer)
23:45:11 <dminuoso> Perhaps I misused that term here.
23:45:14 <glguy> and deferring it to the user means making the parser API more complicated
23:45:35 <dminuoso> If everything has a default mode, it wont make it more complicated unless you opt-in
23:45:58 <dminuoso> Say if you had `parse :: Text -> Either ParseError (Value Position); parse = parseWith defaultOpts`
23:46:41 <glguy> In markdown you can use (from my current reading) + - *
23:46:55 <glguy> and maybe you'd want to mix those up to make it easier to distinguish levels
23:47:20 <glguy> I guess we could require each list to use all of one bullet token
23:47:38 <glguy> thus making it easier to specify nested lists
23:48:14 <dminuoso> Heh, for a while I was wishing for nix-style nested sections
23:48:55 <dminuoso> After an hour or so I decided to restructure the config schema
23:49:27 <dminuoso> Nested lists dont appear to have comfortable solutions, so this seems sensible
23:50:40 <dsal> oats: this API is kind of weird. It looks like it's just here to solve this problem.
23:51:08 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
23:51:26 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
23:53:21 deadmarshal joins (~deadmarsh@95.38.228.30)
23:53:42 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Remote host closed the connection)
23:53:59 hskpractice joins (~hskpracti@94-255-217-215.cust.bredband2.com)
23:54:39 × teo quits (~teo@user/teo) (Ping timeout: 252 seconds)
23:56:50 × shapr quits (~user@pool-100-36-247-68.washdc.fios.verizon.net) (Remote host closed the connection)
23:56:59 Morrow joins (~quassel@bzq-110-168-31-106.red.bezeqint.net)
23:57:11 shapr joins (~user@pool-100-36-247-68.washdc.fios.verizon.net)
23:57:25 × deadmarshal quits (~deadmarsh@95.38.228.30) (Ping timeout: 240 seconds)
23:58:13 × senoraraton quits (~senorarat@192-195-83-130.static.monkeybrains.net) (Ping timeout: 240 seconds)
23:58:23 × hskpractice quits (~hskpracti@94-255-217-215.cust.bredband2.com) (Ping timeout: 256 seconds)
23:58:44 × myShoggoth quits (~myShoggot@97-120-85-195.ptld.qwest.net) (Read error: Connection reset by peer)

All times are in UTC on 2021-12-07.