Logs on 2022-11-17 (liberachat/#haskell)
| 00:02:30 | → | freeside joins (~mengwong@103.252.202.193) |
| 00:05:42 | → | bilegeek joins (~bilegeek@2600:1008:b058:644:36b4:5557:90af:16ca) |
| 00:06:42 | × | thyriaen quits (~thyriaen@2a01:aea0:dd4:470d:6245:cbff:fe9f:48b1) (Remote host closed the connection) |
| 00:06:53 | × | wonko quits (~wjc@2a0e:1c80:2:0:45:15:19:130) (Ping timeout: 256 seconds) |
| 00:08:13 | → | justsomeguy joins (~justsomeg@user/justsomeguy) |
| 00:13:30 | × | merijn quits (~merijn@86.86.29.250) (Ping timeout: 240 seconds) |
| 00:16:31 | × | zebrag quits (~chris@user/zebrag) (Ping timeout: 256 seconds) |
| 00:16:33 | × | caubert quits (~caubert@user/caubert) (Read error: Connection reset by peer) |
| 00:21:31 | × | aliosablack quits (~chomwitt@2a02:587:7a0a:c00:1ac0:4dff:fedb:a3f1) (Ping timeout: 260 seconds) |
| 00:22:23 | → | caubert joins (~caubert@user/caubert) |
| 00:22:49 | × | bontaq quits (~user@ool-45779fe5.dyn.optonline.net) (Ping timeout: 260 seconds) |
| 00:24:59 | → | Techcable joins (~Techcable@user/Techcable) |
| 00:26:50 | × | Kaiepi quits (~Kaiepi@108.175.84.104) (Ping timeout: 268 seconds) |
| 00:27:50 | × | Igloo quits (~ian@matrix.chaos.earth.li) (Quit: BIAS) |
| 00:27:58 | → | Igloo joins (~ian@matrix.chaos.earth.li) |
| 00:28:12 | → | cafkafk joins (~cafkafk@fsf/member/cafkafk) |
| 00:29:02 | × | Igloo quits (~ian@matrix.chaos.earth.li) (Client Quit) |
| 00:29:13 | → | Igloo joins (~ian@matrix.chaos.earth.li) |
| 00:29:27 | → | Kaiepi joins (~Kaiepi@108.175.84.104) |
| 00:31:32 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 255 seconds) |
| 00:32:11 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection) |
| 00:33:06 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 00:37:13 | × | kenaryn quits (~aurele@89-88-44-27.abo.bbox.fr) (Quit: leaving) |
| 00:40:39 | → | wroathe joins (~wroathe@207-153-38-140.fttp.usinternet.com) |
| 00:40:39 | × | wroathe quits (~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host) |
| 00:40:39 | → | wroathe joins (~wroathe@user/wroathe) |
| 00:59:17 | × | Tuplanolla quits (~Tuplanoll@91-159-68-152.elisa-laajakaista.fi) (Quit: Leaving.) |
| 01:01:05 | × | bobbingbob quits (~bobbingbo@2604:3d09:207f:f650::b469) (Ping timeout: 260 seconds) |
| 01:02:35 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds) |
| 01:05:04 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 268 seconds) |
| 01:05:27 | → | ubert1 joins (~Thunderbi@77.119.167.253.wireless.dyn.drei.com) |
| 01:06:30 | × | ubert quits (~Thunderbi@178.165.179.251.wireless.dyn.drei.com) (Ping timeout: 240 seconds) |
| 01:06:32 | ubert1 | is now known as ubert |
| 01:06:56 | <Axman6> | shapr: I usually just reach for tasty, and then add the various runners for quickcheck, hunit, etc. it handles a lot of the more mundane aspects of building a test suite - providing a `main`, handling command line args, letting you specify parameters for the various backends, printing things in a pretty way |
| 01:07:28 | <Axman6> | There's a lot you can add to it: https://hackage.haskell.org/packages/search?terms=tasty |
| 01:08:37 | × | zeenk quits (~zeenk@2a02:2f04:a208:3600::7fe) (Quit: Konversation terminated!) |
| 01:11:37 | × | perrierjouet quits (~perrier-j@modemcable048.127-56-74.mc.videotron.ca) (Quit: WeeChat 3.7.1) |
| 01:16:01 | × | xff0x quits (~xff0x@ai071162.d.east.v6connect.net) (Ping timeout: 256 seconds) |
| 01:16:34 | × | acidjnk quits (~acidjnk@p200300d6e7137a8274644e28d572a0cd.dip0.t-ipconnect.de) (Ping timeout: 252 seconds) |
| 01:16:59 | × | ec quits (~ec@gateway/tor-sasl/ec) (Ping timeout: 255 seconds) |
| 01:17:21 | → | perrierjouet joins (~perrier-j@modemcable048.127-56-74.mc.videotron.ca) |
| 01:18:06 | → | ec joins (~ec@gateway/tor-sasl/ec) |
| 01:21:34 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 01:21:43 | × | gurkenglas quits (~gurkengla@p548ac72e.dip0.t-ipconnect.de) (Ping timeout: 260 seconds) |
| 01:22:54 | × | Neuromancer quits (~Neuromanc@user/neuromancer) (Ping timeout: 260 seconds) |
| 01:24:54 | × | wroathe quits (~wroathe@user/wroathe) (Quit: leaving) |
| 01:25:07 | → | wroathe joins (~wroathe@207-153-38-140.fttp.usinternet.com) |
| 01:25:07 | × | wroathe quits (~wroathe@207-153-38-140.fttp.usinternet.com) (Changing host) |
| 01:25:07 | → | wroathe joins (~wroathe@user/wroathe) |
| 01:25:33 | → | Chioque joins (~mansur@mdh-12-178.tm.net.my) |
| 01:26:31 | × | Chioque quits (~mansur@mdh-12-178.tm.net.my) (Client Quit) |
| 01:26:31 | → | evanvarvell joins (~evanvarve@097-088-181-216.res.spectrum.com) |
| 01:31:01 | → | freeside joins (~mengwong@103.252.202.193) |
| 01:34:09 | <Axman6> | Anyone know of any companies looking for remote Haskell devs? |
| 01:35:10 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 240 seconds) |
| 01:36:47 | × | cafkafk quits (~cafkafk@fsf/member/cafkafk) (Ping timeout: 255 seconds) |
| 01:40:07 | × | chexum quits (~quassel@gateway/tor-sasl/chexum) (Remote host closed the connection) |
| 01:41:01 | × | mei quits (~mei@user/mei) (Remote host closed the connection) |
| 01:41:09 | → | chexum joins (~quassel@gateway/tor-sasl/chexum) |
| 01:41:26 | → | mei joins (~mei@user/mei) |
| 01:41:50 | → | srz joins (~srz@179.36.80.14) |
| 01:42:33 | × | srz quits (~srz@179.36.80.14) (Remote host closed the connection) |
| 01:42:52 | → | srz joins (~srz@179.36.80.14) |
| 01:48:41 | → | freeside joins (~mengwong@103.252.202.193) |
| 01:48:46 | × | poscat quits (~poscat@2408:8206:4823:fd6f:98ab:5c38:136c:5932) (Quit: Bye) |
| 01:49:07 | → | poscat joins (~poscat@114.245.106.84) |
| 01:56:10 | × | Kaiepi quits (~Kaiepi@108.175.84.104) (Ping timeout: 240 seconds) |
| 01:56:20 | × | spaced quits (uid572193@user/spaced) (Quit: Connection closed for inactivity) |
| 02:01:39 | → | razetime joins (~quassel@117.193.7.131) |
| 02:01:44 | → | xff0x joins (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) |
| 02:10:08 | → | merijn joins (~merijn@86-86-29-250.fixed.kpn.net) |
| 02:14:51 | → | mixfix41 joins (~sdeny9ee@user/mixfix41) |
| 02:18:11 | × | mmhat quits (~mmh@p200300f1c71a6d71ee086bfffe095315.dip0.t-ipconnect.de) (Ping timeout: 260 seconds) |
| 02:20:13 | → | cafkafk joins (~cafkafk@fsf/member/cafkafk) |
| 02:20:37 | × | mixfix41 quits (~sdeny9ee@user/mixfix41) (Ping timeout: 256 seconds) |
| 02:29:50 | × | beteigeuze quits (~Thunderbi@bl14-81-220.dsl.telepac.pt) (Ping timeout: 240 seconds) |
| 02:31:27 | → | mmhat joins (~mmh@p200300f1c704c721ee086bfffe095315.dip0.t-ipconnect.de) |
| 02:32:13 | × | justsomeguy quits (~justsomeg@user/justsomeguy) (Quit: WeeChat 3.6) |
| 02:32:17 | → | tabemann joins (~tabemann@2600:1700:7990:24e0:6933:bf5a:ceeb:44f) |
| 02:33:47 | × | srz quits (~srz@179.36.80.14) (Remote host closed the connection) |
| 02:34:01 | → | srz joins (~srz@179.36.80.14) |
| 02:35:37 | × | srz quits (~srz@179.36.80.14) (Remote host closed the connection) |
| 02:36:02 | → | srz joins (~srz@179.36.80.14) |
| 02:37:37 | × | srz quits (~srz@179.36.80.14) (Remote host closed the connection) |
| 02:38:00 | → | srz joins (~srz@179.36.80.14) |
| 02:44:36 | × | merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 256 seconds) |
| 02:45:11 | <Profpatsch> | no way lol, don’t tell me foo.role is a syntax error because `role` is somehow a reserved keyword |
| 02:45:11 | × | srz quits (~srz@179.36.80.14) (Remote host closed the connection) |
| 02:45:30 | <Profpatsch> | I changed it to say foo.rolename and the syntax error went away |
| 02:52:22 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 268 seconds) |
| 02:53:33 | <EvanR> | change it to lol instead |
| 02:59:45 | → | freeside joins (~mengwong@103.252.202.193) |
| 03:00:00 | × | jero98772 quits (~jero98772@2800:484:1d80:d8ce:efcc:cbb3:7f2a:6dff) (Remote host closed the connection) |
| 03:09:21 | × | td_ quits (~td@83.135.9.43) (Ping timeout: 256 seconds) |
| 03:11:13 | → | td_ joins (~td@83.135.9.50) |
| 03:14:15 | × | [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection) |
| 03:16:28 | → | marc__ joins (~marc@5.83.191.222) |
| 03:19:47 | × | marc___ quits (~marc@5.83.191.221) (Ping timeout: 260 seconds) |
| 03:22:41 | <Axman6> | Profpatsch: see https://gitlab.haskell.org/ghc/ghc/-/wikis/roles |
| 03:24:33 | × | bilegeek quits (~bilegeek@2600:1008:b058:644:36b4:5557:90af:16ca) (Quit: Leaving) |
| 03:29:45 | × | ddellacosta quits (~ddellacos@143.244.47.83) (Ping timeout: 256 seconds) |
| 03:41:18 | × | perrierjouet quits (~perrier-j@modemcable048.127-56-74.mc.videotron.ca) (Quit: WeeChat 3.7.1) |
| 03:42:23 | → | perrierjouet joins (~perrier-j@modemcable048.127-56-74.mc.videotron.ca) |
| 03:46:45 | × | razetime quits (~quassel@117.193.7.131) (Ping timeout: 256 seconds) |
| 03:47:12 | → | finn_elija joins (~finn_elij@user/finn-elija/x-0085643) |
| 03:47:12 | × | FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Killed (NickServ (Forcing logout FinnElija -> finn_elija))) |
| 03:47:12 | finn_elija | is now known as FinnElija |
| 03:48:17 | × | mzan quits (~quassel@mail.asterisell.com) (Quit: https://quassel-irc.org - Chat comfortably. Anywhere.) |
| 03:49:26 | → | mzan joins (~quassel@mail.asterisell.com) |
| 04:06:22 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 268 seconds) |
| 04:15:29 | × | evanvarvell quits (~evanvarve@097-088-181-216.res.spectrum.com) (Quit: Leaving) |
| 04:15:56 | → | freeside joins (~mengwong@103.252.202.193) |
| 04:21:30 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 256 seconds) |
| 04:29:26 | × | troydm quits (~troydm@host-176-37-124-197.b025.la.net.ua) (Ping timeout: 256 seconds) |
| 04:31:50 | × | lechner quits (~lechner@debian/lechner) (Ping timeout: 240 seconds) |
| 04:32:09 | → | razetime joins (~quassel@117.193.7.131) |
| 04:33:08 | → | lechner joins (~lechner@debian/lechner) |
| 04:36:08 | × | lechner quits (~lechner@debian/lechner) (Remote host closed the connection) |
| 04:38:53 | → | zebrag joins (~chris@user/zebrag) |
| 04:39:54 | × | zebrag quits (~chris@user/zebrag) (Client Quit) |
| 04:41:40 | → | merijn joins (~merijn@86-86-29-250.fixed.kpn.net) |
| 04:50:38 | → | freeside joins (~mengwong@103.252.202.193) |
| 04:56:51 | → | lechner joins (~lechner@debian/lechner) |
| 04:57:46 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 256 seconds) |
| 04:59:47 | → | mbuf joins (~Shakthi@49.204.115.42) |
| 05:06:51 | phma_ | is now known as phma |
| 05:07:30 | → | shapr` joins (~user@2601:7c0:c383:70:87f8:8431:4c:ee0) |
| 05:08:50 | × | shapr quits (~user@68.54.166.125) (Ping timeout: 240 seconds) |
| 05:15:26 | × | merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 268 seconds) |
| 05:21:00 | × | lechner quits (~lechner@debian/lechner) (Ping timeout: 256 seconds) |
| 05:30:22 | → | lechner joins (~lechner@debian/lechner) |
| 05:30:23 | × | Unicorn_Princess quits (~Unicorn_P@user/Unicorn-Princess/x-3540542) (Remote host closed the connection) |
| 05:31:28 | × | Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 268 seconds) |
| 05:31:43 | → | Lord_of_Life joins (~Lord@user/lord-of-life/x-2819915) |
| 05:34:02 | → | dextaa joins (~DV@user/dextaa) |
| 05:38:06 | × | mmhat quits (~mmh@p200300f1c704c721ee086bfffe095315.dip0.t-ipconnect.de) (Quit: WeeChat 3.7.1) |
| 05:42:17 | → | Guest63 joins (~Guest63@rrcs-108-176-74-69.nys.biz.rr.com) |
| 05:44:08 | × | Guest63 quits (~Guest63@rrcs-108-176-74-69.nys.biz.rr.com) (Quit: Client closed) |
| 05:48:42 | → | chromoblob joins (~user@37.113.164.122) |
| 05:49:14 | → | nate4 joins (~nate@98.45.169.16) |
| 05:54:15 | × | chromoblob quits (~user@37.113.164.122) (Ping timeout: 260 seconds) |
| 05:54:15 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 260 seconds) |
| 05:55:39 | × | nate4 quits (~nate@98.45.169.16) (Ping timeout: 260 seconds) |
| 06:02:45 | × | razetime quits (~quassel@117.193.7.131) (Ping timeout: 256 seconds) |
| 06:03:19 | → | razetime joins (~quassel@117.254.35.45) |
| 06:03:45 | → | freeside joins (~mengwong@103.252.202.193) |
| 06:12:23 | × | razetime quits (~quassel@117.254.35.45) (Ping timeout: 256 seconds) |
| 06:12:30 | → | razetime joins (~quassel@117.254.35.190) |
| 06:17:21 | × | pyrex quits (~pyrex@user/pyrex) (Read error: Connection reset by peer) |
| 06:17:49 | → | takuan joins (~takuan@178-116-218-225.access.telenet.be) |
| 06:19:22 | × | Erutuon quits (~Erutuon@user/erutuon) (Ping timeout: 256 seconds) |
| 06:28:18 | × | zaquest quits (~notzaques@5.130.79.72) (Remote host closed the connection) |
| 06:32:54 | → | AyLaa23 joins (~KELEBEK@95.70.185.131) |
| 06:33:14 | × | arkeet quits (arkeet@moriya.ca) (Quit: ZNC 1.8.2 - https://znc.in) |
| 06:33:25 | → | arkeet joins (arkeet@moriya.ca) |
| 06:33:27 | → | zaquest joins (~notzaques@5.130.79.72) |
| 06:35:30 | → | res0nat0r0844909 joins (~Fletch@fenrir.whatbox.ca) |
| 06:35:32 | × | shailangsa quits (~shailangs@109.159.108.137) (Read error: Connection reset by peer) |
| 06:35:57 | × | AyLaa23 quits (~KELEBEK@95.70.185.131) (Client Quit) |
| 06:36:08 | × | oats quits (~thomas@user/oats) (Quit: until later, my friends) |
| 06:36:43 | → | oats joins (~thomas@user/oats) |
| 06:37:00 | × | califax quits (~califax@user/califx) (Quit: ZNC 1.8.2 - https://znc.in) |
| 06:37:10 | × | res0nat0r084490 quits (~Fletch@fenrir.whatbox.ca) (Ping timeout: 240 seconds) |
| 06:37:40 | × | arahael quits (~arahael@193-119-109-208.tpgi.com.au) (Ping timeout: 260 seconds) |
| 06:38:15 | × | heath quits (~heath@user/heath) (Ping timeout: 260 seconds) |
| 06:38:56 | → | heath joins (~heath@user/heath) |
| 06:39:11 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 255 seconds) |
| 06:41:40 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 06:41:48 | → | califax joins (~califax@user/califx) |
| 06:45:46 | → | fockerize joins (~finn@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr) |
| 06:46:39 | × | bgs quits (~bgs@212-85-160-171.dynamic.telemach.net) (Remote host closed the connection) |
| 06:49:28 | → | arahael joins (~arahael@193-119-109-208.tpgi.com.au) |
| 06:50:55 | → | Neuromancer joins (~Neuromanc@user/neuromancer) |
| 06:51:55 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 06:52:46 | → | Guest75 joins (~Guest75@178.141.130.118) |
| 06:54:26 | × | stiell quits (~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection) |
| 06:55:35 | → | stiell joins (~stiell@gateway/tor-sasl/stiell) |
| 07:01:35 | → | michalz joins (~michalz@185.246.207.221) |
| 07:02:59 | × | shriekingnoise quits (~shrieking@186.137.167.202) (Quit: Quit) |
| 07:08:39 | × | stiell quits (~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection) |
| 07:11:10 | → | merijn joins (~merijn@86-86-29-250.fixed.kpn.net) |
| 07:12:28 | → | stiell joins (~stiell@gateway/tor-sasl/stiell) |
| 07:12:52 | × | cafkafk quits (~cafkafk@fsf/member/cafkafk) (Remote host closed the connection) |
| 07:14:01 | → | cafkafk joins (~cafkafk@fsf/member/cafkafk) |
| 07:16:10 | × | merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 260 seconds) |
| 07:17:02 | × | megaTherion quits (~therion@unix.io) (Quit: ZNC 1.8.2 - https://znc.in) |
| 07:17:24 | → | megaTherion joins (~therion@unix.io) |
| 07:17:30 | → | shailangsa joins (~shailangs@host109-159-108-137.range109-159.btcentralplus.com) |
| 07:18:32 | → | cfricke joins (~cfricke@user/cfricke) |
| 07:21:31 | × | jao quits (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net) (Ping timeout: 256 seconds) |
| 07:24:33 | × | mvk quits (~mvk@2607:fea8:5ce3:8500::4b68) (Quit: Going elsewhere) |
| 07:26:12 | → | Kaiepi joins (~Kaiepi@108.175.84.104) |
| 07:28:39 | × | xff0x quits (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) (Ping timeout: 260 seconds) |
| 07:31:07 | → | xff0x joins (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) |
| 07:34:07 | × | DDR quits (~DDR@2604:3d08:4c7f:8250:843b:f3d0:47c:129e) (Ping timeout: 260 seconds) |
| 07:34:58 | × | Kaiepi quits (~Kaiepi@108.175.84.104) (Quit: Leaving) |
| 07:39:05 | × | razetime quits (~quassel@117.254.35.190) (Ping timeout: 256 seconds) |
| 07:39:10 | → | razetime_ joins (~quassel@117.193.6.245) |
| 07:39:44 | → | hamster joins (~ham@user/ham) |
| 07:39:46 | → | troydm joins (~troydm@host-176-37-124-197.b025.la.net.ua) |
| 07:40:13 | × | ham quits (~ham@user/ham) (Ping timeout: 256 seconds) |
| 07:45:19 | razetime_ | is now known as razetime |
| 07:45:29 | × | razetime quits (~quassel@117.193.6.245) (Quit: https://quassel-irc.org - Chat comfortably. Anywhere.) |
| 07:45:45 | → | razetime joins (~quassel@117.193.6.245) |
| 07:45:54 | → | kenran joins (~user@user/kenran) |
| 07:48:46 | → | Kaiepi joins (~Kaiepi@108.175.84.104) |
| 07:48:57 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 07:51:05 | → | Erutuon joins (~Erutuon@user/erutuon) |
| 07:52:25 | × | takuan quits (~takuan@178-116-218-225.access.telenet.be) (Read error: Connection reset by peer) |
| 07:54:43 | × | vglfr quits (~vglfr@145.224.100.22) (Quit: Quit) |
| 07:54:58 | → | vglfr joins (~vglfr@145.224.100.22) |
| 07:57:02 | × | kenran quits (~user@user/kenran) (Remote host closed the connection) |
| 07:57:36 | → | takuan joins (~takuan@178-116-218-225.access.telenet.be) |
| 07:59:44 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds) |
| 08:01:07 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 08:01:55 | → | zeenk joins (~zeenk@2a02:2f04:a208:3600::7fe) |
| 08:07:20 | → | lortabac joins (~lortabac@2a01:e0a:541:b8f0:158b:ea0c:943d:cbc4) |
| 08:11:47 | <dminuoso> | lyxia, Profpatsch: Also consider QualifiedDo, which goes into a similar department. |
| 08:12:39 | <dminuoso> | Though I do not know whether it is planned to expose Data.Maybe.>>= |
| 08:15:14 | → | ub joins (~Thunderbi@77.119.167.253.wireless.dyn.drei.com) |
| 08:17:18 | × | vglfr quits (~vglfr@145.224.100.22) (Read error: Connection reset by peer) |
| 08:17:27 | → | vglfr joins (~vglfr@145.224.100.22) |
| 08:17:50 | → | chele joins (~chele@user/chele) |
| 08:18:35 | × | razetime quits (~quassel@117.193.6.245) (Ping timeout: 268 seconds) |
| 08:25:27 | × | fockerize quits (~finn@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr) (Ping timeout: 260 seconds) |
| 08:25:38 | → | mncheck joins (~mncheck@193.224.205.254) |
| 08:27:42 | × | megaTherion quits (~therion@unix.io) (Max SendQ exceeded) |
| 08:29:26 | → | zmt01 joins (~zmt00@user/zmt00) |
| 08:29:56 | → | merijn joins (~merijn@86-86-29-250.fixed.kpn.net) |
| 08:30:51 | → | megaTherion joins (~therion@unix.io) |
| 08:32:21 | × | waleee quits (~waleee@2001:9b0:213:7200:cc36:a556:b1e8:b340) (Ping timeout: 256 seconds) |
| 08:32:43 | <dminuoso> | https://hackage.haskell.org/package/ghc-prim-0.9.0/docs/GHC-Magic.html |
| 08:32:49 | <dminuoso> | Today we know for sure, GHC uses magic. |
| 08:32:55 | × | zmt00 quits (~zmt00@user/zmt00) (Ping timeout: 260 seconds) |
| 08:34:41 | → | acidjnk joins (~acidjnk@p200300d6e7137a8274644e28d572a0cd.dip0.t-ipconnect.de) |
| 08:35:30 | × | megaTherion quits (~therion@unix.io) (Ping timeout: 260 seconds) |
| 08:42:41 | → | vpan joins (~0@212.117.1.172) |
| 08:42:58 | → | MajorBiscuit joins (~MajorBisc@2a02-a461-129d-1-193d-75d8-745d-e91e.fixed6.kpn.net) |
| 08:44:44 | → | aliosablack joins (~chomwitt@2a02:587:7a0a:c00:1ac0:4dff:fedb:a3f1) |
| 08:51:02 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds) |
| 08:52:03 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 08:53:15 | → | nschoe joins (~q@141.101.51.197) |
| 08:56:06 | → | chromoblob joins (~user@37.113.164.122) |
| 08:56:24 | → | coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) |
| 08:59:03 | × | ft quits (~ft@p508dbd59.dip0.t-ipconnect.de) (Quit: leaving) |
| 09:01:36 | × | tzh quits (~tzh@c-24-21-73-154.hsd1.wa.comcast.net) (Quit: zzz) |
| 09:03:11 | × | Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer) |
| 09:06:50 | <Profpatsch> | dminuoso: I’m pretty sure there’s a bug in runRW# and ST atm, so much for magic :P |
| 09:07:13 | <Profpatsch> | But I can’t for the hell of me minify the repro case |
| 09:07:18 | × | cfricke quits (~cfricke@user/cfricke) (Quit: WeeChat 3.7.1) |
| 09:07:35 | → | megaTherion joins (~therion@unix.io) |
| 09:07:42 | <Profpatsch> | It depends on a weird combination of out-of-module dependencies & runST |
| 09:09:53 | → | fserucas joins (~fserucas@2001:818:e376:a400:fb92:70c1:dd88:c7d7) |
| 09:10:05 | <Profpatsch> | So if anybody here has experience debugging GHC optimization bugs :) |
| 09:10:58 | <dminuoso> | Profpatsch: Given that Im playing a lot with runRW# right now, keep me apprised. |
| 09:11:22 | <dminuoso> | Profpatsch: Out of curiosity, how are you using runRW#? |
| 09:12:02 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Remote host closed the connection) |
| 09:12:10 | <dminuoso> | You arent by any chance exfiltrating the state token out of runRW# like `let s = runRW# noDuplicate#`, are you? |
| 09:12:14 | × | kaskal quits (~kaskal@89.144.223.95) (Ping timeout: 268 seconds) |
| 09:12:33 | → | kaskal joins (~kaskal@213-225-13-82.nat.highway.a1.net) |
| 09:13:09 | <Profpatsch> | runST |
| 09:13:28 | × | lambdabot quits (~lambdabot@haskell/bot/lambdabot) (Ping timeout: 268 seconds) |
| 09:13:52 | <Profpatsch> | dminuoso: https://github.com/agrafix/superrecord/issues/38 |
| 09:15:08 | × | dfee quits (~dfee@162-227-164-101.lightspeed.sntcca.sbcglobal.net) (Quit: dfee) |
| 09:15:13 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 09:15:31 | → | lambdabot joins (~lambdabot@silicon.int-e.eu) |
| 09:15:31 | × | lambdabot quits (~lambdabot@silicon.int-e.eu) (Changing host) |
| 09:15:31 | → | lambdabot joins (~lambdabot@haskell/bot/lambdabot) |
| 09:17:08 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds) |
| 09:17:40 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 09:22:13 | × | chromoblob quits (~user@37.113.164.122) (Ping timeout: 256 seconds) |
| 09:22:58 | → | enoq joins (~enoq@2a05:1141:1f5:5600:b9c9:721a:599:bfe7) |
| 09:25:13 | <dminuoso> | Profpatsch: It should be trivial to test it |
| 09:25:16 | → | `2jt joins (~jtomas@191.red-88-17-199.dynamicip.rima-tde.net) |
| 09:28:48 | → | mixfix41 joins (~sdeny9ee@user/mixfix41) |
| 09:29:54 | → | titibandit joins (~titibandi@xdsl-78-35-182-184.nc.de) |
| 09:30:54 | × | merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 256 seconds) |
| 09:32:10 | <Profpatsch> | dminuoso: I’m trying to remove stuff from the code, and the problem vanishes once I remove some stuff that seems unrelated |
| 09:33:35 | × | mixfix41 quits (~sdeny9ee@user/mixfix41) (Ping timeout: 260 seconds) |
| 09:34:41 | → | CiaoSen joins (~Jura@p200300c95701f1002a3a4dfffe84dbd5.dip0.t-ipconnect.de) |
| 09:35:57 | <dminuoso> | Im having some troubles understanding the original bug honestly heh |
| 09:37:26 | → | accord joins (uid568320@id-568320.hampstead.irccloud.com) |
| 09:39:53 | <accord> | How does haskell decide whether to reduce or accumulate |
| 09:40:22 | <dminuoso> | accord: A) what do you mean by "haskell decicdes", and what in your mind is the difference between reduce and accumulate? |
| 09:40:26 | → | mixfix41 joins (~sdenynine@user/mixfix41) |
| 09:41:30 | <accord> | dminuoso: accumulate is when basically an expression is accumulated in a thunk. Reduce is when it's partially or fully evaluated |
| 09:42:21 | <dminuoso> | So is your question when GHC haskell might preemptively reduce an expression before it is demanded? |
| 09:42:58 | <accord> | Yup, it's not 100% lazy, it's non-strict, meaning it has some heursitics when to do what |
| 09:43:31 | <dminuoso> | So lets start with a simplified world model, then we progressively get to what happens in GHC. |
| 09:44:00 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 09:44:26 | <dminuoso> | Evaluation is driven by demand, which essentially happens whenever a pattern match occurs like in case-of or a function argument pattern match |
| 09:44:35 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 09:44:59 | <dminuoso> | Observe, case-of or function pattern matching will scrutinize on a *data* constructor, and that is as far as evaluation will occur. |
| 09:45:44 | <dminuoso> | We call that form where the redex is reduced up until the next constructor WHNF (weak head normal form) |
| 09:45:47 | <dminuoso> | accord: so far so good? |
| 09:46:45 | <dminuoso> | So if `case x of Nothing -> ...; Just a -> ...` is demanded, then `x` is evaluated up until the outer constructor (meaning in the Just case, `a` is left as a thunk) |
| 09:46:58 | → | __monty__ joins (~toonn@user/toonn) |
| 09:48:08 | <accord> | dminuoso: sure, I think the problem is this... imagine there's no demand, but the accumulation is so vast, that the thunk that calculates in the end is integer 42, but the state it holds because no one demands this 42 yet, is hundreds of GB of RAM |
| 09:48:24 | <dminuoso> | accord: We'll get there. |
| 09:48:47 | <dminuoso> | That's strike one. Strike two is, we get a primitive called `seq` (or equivalently bang patterns with !, but they are equivalent to seq, and their uses get desugared into uses of seq), which lets you express `let b' = seq a b` which says `when b' is demanded, give b but *also* evaluate a into WHNF` |
| 09:49:53 | <dminuoso> | Note that there is no particular ordering specified, so a may be evaluated in parallel or potentially even after b, but it *will* get evaluated eventually |
| 09:50:41 | <accord> | cool |
| 09:50:43 | <accord> | :) |
| 09:50:52 | <tomsmeding> | dminuoso: will `a` get evaluated before the code that ran `seq` will get to see the results of `b`? |
| 09:51:30 | <tomsmeding> | hm, no such a guarantee can't be there if `a` is potentially evaluated after `b` |
| 09:51:31 | <dminuoso> | tomsmeding: sure, it just means seq wouldnt do anything then. |
| 09:51:51 | <dminuoso> | seq does not mean "not before", its just "try and force when the second argument is demanded" |
| 09:51:58 | <dminuoso> | might already be forced, doesnt matter |
| 09:52:07 | → | nate4 joins (~nate@98.45.169.16) |
| 09:52:07 | <tomsmeding> | yeah sure, forcing an already forced value doesn't do anything |
| 09:52:23 | <dminuoso> | accord: so, we can employ something like: |
| 09:52:29 | <tomsmeding> | but as a user of seq, I would expect `a` to be done evaluating after `seq a b` is done |
| 09:52:33 | <dminuoso> | accord: `let x = 1 + 3 in seq x (f x)` |
| 09:52:41 | <dminuoso> | which might evaluate the argument *before* it enters f. |
| 09:52:48 | <dminuoso> | accord: so far so good? |
| 09:52:52 | <c_wraith> | tomsmeding: yes, that is guaranteed. that's all that's guaranteed. |
| 09:53:08 | <tomsmeding> | c_wraith: yay, otherwise I would need to revisit how I use seq :p |
| 09:53:28 | → | wonko joins (~wjc@2a0e:1c80:2:0:45:15:19:130) |
| 09:53:59 | <accord> | dminuoso: sort of :D |
| 09:54:14 | <accord> | dminuoso: I wonder does ghc evaluate a thunk partially simply if it gets too big |
| 09:54:44 | <dminuoso> | accord: nope |
| 09:54:51 | <dminuoso> | accord: So this is where it gets interesting |
| 09:55:02 | <dminuoso> | If you naively do something like: |
| 09:55:58 | tomsmeding | expects foldl |
| 09:55:59 | <dminuoso> | `foldr (+) 0 [1..1000000000000]` we will have a strange interaction |
| 09:56:20 | <c_wraith> | that never has large thunks |
| 09:56:26 | <dminuoso> | Note, we have to assume some GHC optimizations to be disabled, so if you try this, use -O0 |
| 09:56:32 | <c_wraith> | it uses a huge amount of stack, but the thunks are small |
| 09:56:41 | <dminuoso> | Ah right |
| 09:56:46 | <dminuoso> | foldl indeed. |
| 09:56:55 | <dminuoso> | But we can look into foldr after this too. |
| 09:56:59 | <tomsmeding> | :) |
| 09:57:10 | <dminuoso> | `foldl (+) 0 [1..1000000000000]` will end up producing an expression tree that looks like: |
| 09:57:13 | <c_wraith> | both foldl and foldr are bad there. It's worth looking into what each does badly. :) |
| 09:57:21 | × | nate4 quits (~nate@98.45.169.16) (Ping timeout: 256 seconds) |
| 09:57:53 | <dminuoso> | ....(((0+1)+2)+3)+4.... |
| 09:58:26 | <dminuoso> | accord: and the reason for that is, foldl does not have any strictness annotations, so it will actually exhaust memory with thunks. |
| 09:58:31 | <dminuoso> | Nothing is done to prevent that. |
| 09:58:45 | <tomsmeding> | well, nothing at _runtime_ |
| 09:58:48 | <dminuoso> | well. GHC has some RULEs in place to rewrite some *particular* invocations like that one actually |
| 09:58:58 | <dminuoso> | But for the sake of argument, ignore those. |
| 09:59:30 | × | EvanR quits (~EvanR@user/evanr) (Ping timeout: 260 seconds) |
| 09:59:36 | <dminuoso> | accord: Instead, if you want to accumulate with a strict accumulator, you have to use this primitive: |
| 09:59:43 | → | EvanR joins (~EvanR@user/evanr) |
| 10:00:06 | <dminuoso> | https://hackage.haskell.org/package/base-4.17.0.0/docs/src/Data.Foldable.html#foldl%27 |
| 10:00:29 | <dminuoso> | Gloss over the `oneShot` there, its not relevant to the discussion. What is however relevant, is that `seq` in there. |
| 10:01:36 | <dminuoso> | So we could write it as:" |
| 10:02:38 | → | fockerize joins (~finn@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr) |
| 10:03:25 | <dminuoso> | foldl' f z0 xs = foldr (\x k z -> z `seq` k (f z x)) id xs z0 |
| 10:03:54 | → | srk joins (~sorki@user/srk) |
| 10:03:56 | <dminuoso> | The way its written is base is done to promote better optimizations, but what I want to get at is that `seq` in there. There's also a change to foldlr. |
| 10:04:12 | → | merijn joins (~merijn@86-86-29-250.fixed.kpn.net) |
| 10:04:42 | <dminuoso> | accord: so it is that `seq` that will evaluate the accumulator each time that function is entered, preventing a thunk build-up. So whats to prevent the thunk buildup? It's the programmer really. |
| 10:05:04 | <dminuoso> | You have to be aware of strictness, and use the right functions. If you want a loop-behavior with a counter, use `foldl'` |
| 10:05:40 | <dminuoso> | https://hackage.haskell.org/package/base-4.17.0.0/docs/src/GHC.List.html#sum |
| 10:05:42 | <dminuoso> | sum = foldl' (+) 0 |
| 10:06:11 | <dminuoso> | (Note this is not the same `sum` as from Prelude, which uses a slightly different definition, but again I want to keep things simple) |
| 10:06:50 | × | xff0x quits (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) (Ping timeout: 240 seconds) |
| 10:07:21 | × | perrierjouet quits (~perrier-j@modemcable048.127-56-74.mc.videotron.ca) (Quit: WeeChat 3.7.1) |
| 10:07:35 | → | mauke joins (~mauke@p54958ca8.dip0.t-ipconnect.de) |
| 10:08:06 | → | chromoblob joins (~user@37.113.164.122) |
| 10:10:35 | <accord> | dminuoso thank you for covering that ground. I'll reread and chew :) |
| 10:11:10 | × | vglfr quits (~vglfr@145.224.100.22) (Ping timeout: 240 seconds) |
| 10:11:18 | → | perrierjouet joins (~perrier-j@modemcable048.127-56-74.mc.videotron.ca) |
| 10:11:27 | <accord> | dminuoso: I honestly wish it was automatic |
| 10:11:37 | <tomsmeding> | There's also the strictness analyser in ghc |
| 10:11:38 | <accord> | optimizing for less cpu/ram use |
| 10:11:49 | <accord> | AI :P |
| 10:12:30 | <tomsmeding> | A compile-time optimisation that attempts to determine if a computation (in your source code) is fully strict anyway; and if it succeeds in that, it adds seq calls in the right places to make sure that computation _is_ evaluated strictly |
| 10:12:40 | <tomsmeding> | But it's easy to defeat the strictness checker |
| 10:13:04 | <tomsmeding> | And easy to do so accidentally, although it is already quite effective as it is |
| 10:13:34 | <dminuoso> | That being said, there's also mechanisms to introduce extra lazyness (that is, making things even more lazy) |
| 10:14:54 | <dminuoso> | Which is lazy patterns, which actually turns off evaluation on a case-of and defers evaluation even further. So that can be useful too |
| 10:15:29 | × | eggplantade quits (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection) |
| 10:15:42 | <accord> | how about tic toc... the runtime alternates between accumulation and reduction and notices which leads to less RAM use and skews it to that direction |
| 10:15:54 | <accord> | for each type of expression |
| 10:16:44 | <accord> | How about stochastically doing one or the other, trying to spot patterns which simplify the entire state |
| 10:17:20 | <tomsmeding> | I would expect that to reduce the expected amount of memory usage, but raise the execution time constant factor significantly |
| 10:17:37 | <tomsmeding> | Doing the same thing over and over is something that computers tend to be good at |
| 10:28:05 | × | troydm quits (~troydm@host-176-37-124-197.b025.la.net.ua) (Ping timeout: 260 seconds) |
| 10:29:32 | → | gurkenglas joins (~gurkengla@84.138.199.46) |
| 10:31:42 | <accord> | tomsmeding: it's basically about predicting if something is better precalculated or not. |
| 10:31:57 | <accord> | tomsmeding not precalculated bu calculated as early as possible |
| 10:32:13 | <accord> | tomsmeding: in CPU design we more often have speculative execution rather than lazy execution |
| 10:33:04 | <dminuoso> | we could even do speculative execution in haskell |
| 10:33:26 | <dminuoso> | But afaik the runtime system does not allow for it, currently |
| 10:36:33 | × | gentauro quits (~gentauro@user/gentauro) (Read error: Connection reset by peer) |
| 10:36:52 | → | Guest|78 joins (~Guest|78@cpc77553-cwma10-2-0-cust21.7-3.cable.virginm.net) |
| 10:37:01 | <accord> | dminuoso: yup I like the idea of non-strict execution as it permits in theory the runtime to choose when to execute |
| 10:37:10 | × | Guest|78 quits (~Guest|78@cpc77553-cwma10-2-0-cust21.7-3.cable.virginm.net) (Client Quit) |
| 10:37:34 | <dminuoso> | accord: good choice of the term `non-strict` there :) |
| 10:37:41 | <accord> | :D |
| 10:38:06 | → | vglfr joins (~vglfr@145.224.100.22) |
| 10:42:27 | → | cfricke joins (~cfricke@user/cfricke) |
| 10:42:32 | → | gentauro joins (~gentauro@user/gentauro) |
| 10:43:00 | → | mmhat joins (~mmh@p200300f1c704c721ee086bfffe095315.dip0.t-ipconnect.de) |
| 10:43:34 | <dminuoso> | For what its worth, speculative execution is mostly the singular reason for most recent CPU security bugs. :p |
| 10:43:52 | <dminuoso> | Speculative execution with a singular cache is a dangerous proposition |
| 10:45:00 | × | quintasan quits (~quassel@quintasan.pl) () |
| 10:45:12 | → | quintasan joins (~quassel@quintasan.pl) |
| 10:52:29 | × | econo quits (uid147250@user/econo) (Quit: Connection closed for inactivity) |
| 10:53:46 | × | use-value quits (~Thunderbi@2a00:23c6:8a03:2f01:29a1:b64:95d9:d66d) (Remote host closed the connection) |
| 10:54:05 | → | use-value joins (~Thunderbi@2a00:23c6:8a03:2f01:29a1:b64:95d9:d66d) |
| 10:54:05 | <tomsmeding> | Also if you speculatively execute, you have the same issues as cpus, i.e. you must swallow exceptions thrown in speculatively executed code |
| 10:54:37 | <tomsmeding> | And mark certain primops as not suitable for speculation, e.g. write-to-fd :p |
| 10:55:03 | <accord> | dminuoso: it's problematic. But I strongly believe an optimal executor needs to have the ability to do 1) out of order 2) speculative 3) lazy 4) eager 5) transform one code to other code... and combine all these (and more) in order ot be effective |
| 10:55:13 | × | xilo quits (~yourname@84.32.165.17) (Ping timeout: 268 seconds) |
| 10:55:19 | <accord> | dminuoso: it's kinda like people with a todo list, as I think about it |
| 10:55:30 | <accord> | We batch, reorder, skip some things, then do them |
| 10:55:33 | × | aliosablack quits (~chomwitt@2a02:587:7a0a:c00:1ac0:4dff:fedb:a3f1) (Remote host closed the connection) |
| 10:55:35 | <dminuoso> | accord: The reality is, most performance gains happen in aggressive inlining. |
| 10:55:41 | <tomsmeding> | Also cpus have more leeway in speculative execution I think because they have available parallelism to do so without impacting the normal instruction stream |
| 10:55:43 | <dminuoso> | Inlining is what allows for faster code. |
| 10:55:50 | <accord> | dminuoso: that too |
| 10:56:19 | <accord> | dminuoso: but it needs to have fallbacks, so we don't lose late binding semantics |
| 10:56:20 | <tomsmeding> | Ghc doesn't have that luxury of spare execution units |
| 10:57:10 | <accord> | i.e. we can think of inlining as aJIT speculative code transform, with guards that have fallbacks to deoptimize and run the general code if the inlined version guards fail |
| 10:57:36 | <accord> | tomsmeding why not? |
| 10:57:41 | <dminuoso> | accord: fun thing, do you know how HotSpot implements deoptimization guards? |
| 10:57:43 | → | mei_ joins (~mei@user/mei) |
| 10:57:52 | <accord> | dminuoso: not in particular I think |
| 10:58:10 | <accord> | conditional jump :P ? |
| 10:58:10 | <dminuoso> | So doing this with a conditional branch has the problem that branch predictors might be in the way |
| 10:58:20 | <dminuoso> | And mispredicted branches are *very* expensive |
| 10:58:26 | <accord> | yup |
| 10:58:36 | <dminuoso> | No what they do instead, is just issue a read to a special address |
| 10:58:47 | <dminuoso> | when the optimization gets invalidated, the page table mapping will be revoked, causing a cpu page fault |
| 10:59:29 | <dminuoso> | and the handler for that will undo the optimizations, and then resume the code |
| 10:59:45 | <dminuoso> | this works very nicely with speculative execution, no branch prediction necessary |
| 10:59:46 | <accord> | Ah so this is to ensure the CPU ignores that fail mode, as it's rare and expensive anyway |
| 10:59:50 | <dminuoso> | yup |
| 10:59:52 | × | mei quits (~mei@user/mei) (Ping timeout: 256 seconds) |
| 10:59:53 | <accord> | NEat |
| 11:00:30 | <accord> | Compilers are full of this crap, it must be maddening to constantly update yourself on how the hardware reacts to code over time. Subtleties change all the time |
| 11:00:45 | <accord> | In terms of performance |
| 11:00:57 | <accord> | Interesting that this is also happening in high level runtimes like JS |
| 11:01:10 | <accord> | Detects patterns and optimizes/inlines aggressively. With guards |
| 11:01:17 | <dminuoso> | in the end cost of this is a TLB entry |
| 11:01:22 | <dminuoso> | so its not entirely cost-free |
| 11:01:55 | <dminuoso> | and it will keep a singular cache line occupied, so there's that too - but even if it becomes a read from memory, speculative execution can resume entirely because there will be *no* data dependencies |
| 11:03:19 | × | Erutuon quits (~Erutuon@user/erutuon) (Ping timeout: 260 seconds) |
| 11:03:39 | × | gurkenglas quits (~gurkengla@84.138.199.46) (Ping timeout: 260 seconds) |
| 11:03:52 | <tomsmeding> | accord: ghc doesn't have any spare execution units available because it doesn't know the number of execution units in the cpu that are unoccupied, and has no way of communicating to the cpu that certain instructions are unimportant |
| 11:04:16 | <tomsmeding> | It has to put them in the normal instruction stream, that might get precedence over the non-speculative stuff |
| 11:04:20 | → | mei joins (~mei@user/mei) |
| 11:04:27 | <tomsmeding> | Which sounds like a bad idea |
| 11:04:40 | <dminuoso> | Profpatsch: Okay after some hours, no I still dont get it. Maybe AndreasK is around later to give me a pointer. |
| 11:04:40 | × | mei quits (~mei@user/mei) (Client Quit) |
| 11:05:36 | <Profpatsch> | dminuoso: you mean how to reproduce? |
| 11:07:04 | → | xff0x joins (~xff0x@2405:6580:b080:900:43db:c639:c914:6f0d) |
| 11:07:06 | <Profpatsch> | It depends on a weird combination of producing a list of Recs which have been `project`ed, in a different module, then fishing for some fields in each Rec, but in a certain way, without forcing the whole thing |
| 11:07:26 | <Profpatsch> | And oh, it only shows if you depend on another function that can’t be inlined when you do that |
| 11:07:39 | <Profpatsch> | once the extra callback goes away, it’s correct again |
| 11:07:39 | <dminuoso> | Profpatsch: Nah the underlying problem why `lazy` is needed in unsafePerformIO |
| 11:07:44 | <dminuoso> | its.. magic. |
| 11:07:50 | × | mei_ quits (~mei@user/mei) (Ping timeout: 240 seconds) |
| 11:08:01 | <Profpatsch> | dminuoso: thing is, superrecord doesn’t even use unsafePerformIO |
| 11:08:03 | <Profpatsch> | It uses runST |
| 11:08:07 | <dminuoso> | Sure |
| 11:08:15 | <Profpatsch> | https://gitlab.haskell.org/ghc/ghc/-/commit/46720997a0b1fa2971a884adf43de096ce130a7e |
| 11:08:22 | <Profpatsch> | ^ this is the change that caused all this afaik |
| 11:08:34 | <dminuoso> | Profpatsch: But runST and unsafePerformIO do essentially the same thiung. |
| 11:08:37 | <Profpatsch> | It floats more things out of runRW as far as I understand |
| 11:08:42 | <dminuoso> | Its a bit beyond me how runST has not received the `lazy` treatment |
| 11:08:56 | <Profpatsch> | Which is why I get sharing between things that should definitely be separate |
| 11:09:58 | <Profpatsch> | I should probably revert that commit, build GHC without it and confirm that it fixes the problem |
| 11:10:10 | <dminuoso> | Profpatsch: Well you dont need a custom GHC |
| 11:10:20 | <dminuoso> | you can just write your own myRunST function and use that instead |
| 11:10:27 | × | CiaoSen quits (~Jura@p200300c95701f1002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 256 seconds) |
| 11:11:16 | × | kritzefitz quits (~kritzefit@debian/kritzefitz) (Ping timeout: 248 seconds) |
| 11:11:36 | → | kritzefitz joins (~kritzefit@debian/kritzefitz) |
| 11:12:02 | <Profpatsch> | dminuoso: the thing is I can see how unsafePerformIO is unsafe |
| 11:12:05 | <Profpatsch> | but using runST shouldn’t be |
| 11:12:47 | <Profpatsch> | Or is this about using the `ST` constructor manually |
| 11:14:44 | <Profpatsch> | dminuoso: what about other uses of runST |
| 11:14:46 | <Profpatsch> | libraries/ghc-bignum/src/GHC/Num/WordArray.hs |
| 11:14:48 | <Profpatsch> | 47:withNewWordArray# sz act = case runRW# io of (# _, a #) -> a |
| 11:15:04 | <Profpatsch> | don’t they all need a lazy before thea |
| 11:15:27 | <Profpatsch> | Is there a way to reach Ben Gamari |
| 11:15:35 | → | beteigeuze joins (~Thunderbi@bl14-81-220.dsl.telepac.pt) |
| 11:15:58 | → | eggplantade joins (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) |
| 11:17:29 | <probie> | Raise an issue on the GHC gitlab? |
| 11:19:02 | <Profpatsch> | probie: I’m commenting everywhere I can lol |
| 11:19:06 | <Profpatsch> | But so far no reactions |
| 11:19:16 | → | raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) |
| 11:20:16 | × | eggplantade quits (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) (Ping timeout: 256 seconds) |
| 11:20:59 | → | machinedgod joins (~machinedg@77.241.232.28) |
| 11:23:39 | → | mei joins (~mei@user/mei) |
| 11:26:18 | <Profpatsch> | well, we don’t have a big dependency on superrecord yet, so the solution here was to drop superrecord :C |
| 11:26:49 | <Profpatsch> | but it would be great if the GHC optimizer didn’t shuffle values around |
| 11:28:13 | × | tcard quits (~tcard@2400:4051:5801:7500:19ce:ed82:2ab7:90f9) (Remote host closed the connection) |
| 11:28:25 | → | tcard joins (~tcard@2400:4051:5801:7500:19ce:ed82:2ab7:90f9) |
| 11:28:30 | → | swamp_ joins (~zmt00@user/zmt00) |
| 11:31:40 | × | zmt01 quits (~zmt00@user/zmt00) (Ping timeout: 260 seconds) |
| 11:31:45 | → | Major_Biscuit joins (~MajorBisc@c-001-001-039.client.tudelft.eduvpn.nl) |
| 11:33:31 | <AndreasK> | dminuoso: I'm here now (but haven't followed the discussion) |
| 11:35:23 | × | MajorBiscuit quits (~MajorBisc@2a02-a461-129d-1-193d-75d8-745d-e91e.fixed6.kpn.net) (Ping timeout: 256 seconds) |
| 11:35:46 | → | mimi1vx[m] joins (~osukupmat@2001:470:69fc:105::2:418d) |
| 11:40:07 | → | szkl joins (uid110435@id-110435.uxbridge.irccloud.com) |
| 11:40:48 | → | CiaoSen joins (~Jura@p200300c95701f1002a3a4dfffe84dbd5.dip0.t-ipconnect.de) |
| 11:43:50 | ← | jakalx parts (~jakalx@base.jakalx.net) () |
| 11:45:08 | <dminuoso> | AndreasK: Hi. Im interested to know the deeper details behind https://gitlab.haskell.org/ghc/ghc/-/merge_requests/4926 |
| 11:45:22 | × | mmhat quits (~mmh@p200300f1c704c721ee086bfffe095315.dip0.t-ipconnect.de) (Quit: WeeChat 3.7.1) |
| 11:45:43 | <dminuoso> | I've read through the related bug report https://gitlab.haskell.org/ghc/ghc/-/issues/19181 - but the descriptions are relatively dense, almost as if it is assumed the other people in the discussion already understand the problem |
| 11:46:37 | <AndreasK> | Curse of knowledge. Always hard to know what others don't |
| 11:47:28 | × | fserucas quits (~fserucas@2001:818:e376:a400:fb92:70c1:dd88:c7d7) (Ping timeout: 256 seconds) |
| 11:48:30 | <dminuoso> | I think my main confusion is about why call-by-value of `f x` (see https://gitlab.haskell.org/ghc/ghc/-/merge_requests/4926/diffs#diff-content-126bdfca3210b211784af55d68bca2d827c811bc) would be a problem at all. |
| 11:49:03 | <dminuoso> | (As to why `lazy` prevents that from occuring is clear to me) |
| 11:50:23 | → | jakalx joins (~jakalx@base.jakalx.net) |
| 11:52:55 | <AndreasK> | dminuoso: I see. It's because `f x` contains a call to unsafePerformIO itself iirc which tries to take a lock or something of the sort |
| 11:55:29 | <AndreasK> | dminuoso: For a different example imagine something along the lines of `unsafePerformIO $ do { let r = unsafePerformIO $ (takeLock x >> doStuff >> releaseLock x); releaseLock x; return r}` |
| 11:55:54 | <AndreasK> | dminuoso: If we evaluate `r` early then it will try to take lock x before it's released and we deadlock |
| 11:56:36 | <AndreasK> | dminuoso: It's not really the call-by-value that is the problem here but the order of execution. |
| 11:56:41 | → | bontaq joins (~user@ool-45779fe5.dyn.optonline.net) |
| 11:57:39 | <dminuoso> | Right this makes sense now. So I guess if demand analysis saw `r` as needed from outside, it might do something along the lines of `let r = unsafePerformIO $ (takeLock x >> doStuff >> releaseLock x) in seq r (releaseLock x >> return r)` |
| 11:57:47 | <dminuoso> | And by adding the lazy that is thwarted |
| 11:58:51 | <AndreasK> | Yeah that's semantically what happens |
| 11:59:37 | <AndreasK> | Operationally we get rid of the thunk for r completely but that doesn't change the meaning in this case |
| 12:00:02 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Ping timeout: 255 seconds) |
| 12:00:08 | <dminuoso> | Right. So that just leaves me to understand https://gitlab.haskell.org/ghc/ghc/-/issues/19413 in relation to this |
| 12:00:39 | <dminuoso> | At first glance that looks entirely different, as newIORef is pushed out of the lambda (if ben is right) |
| 12:04:19 | → | kuribas joins (~user@ip-188-118-57-242.reverse.destiny.be) |
| 12:07:49 | → | wootehfoot joins (~wootehfoo@user/wootehfoot) |
| 12:08:36 | × | jludwig quits (~justin@li657-110.members.linode.com) (Ping timeout: 268 seconds) |
| 12:08:43 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 12:09:27 | → | jludwig joins (~justin@li657-110.members.linode.com) |
| 12:09:37 | → | fserucas joins (~fserucas@2001:8a0:6d00:2500:4717:7619:c4e9:3aa2) |
| 12:11:39 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 256 seconds) |
| 12:19:12 | × | machinedgod quits (~machinedg@77.241.232.28) (Ping timeout: 256 seconds) |
| 12:19:36 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:3cb4:cd70:33e6:e916) |
| 12:22:37 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 12:24:10 | × | eggplantade quits (~Eggplanta@2600:1700:38c5:d800:3cb4:cd70:33e6:e916) (Ping timeout: 260 seconds) |
| 12:25:34 | × | use-value quits (~Thunderbi@2a00:23c6:8a03:2f01:29a1:b64:95d9:d66d) (Remote host closed the connection) |
| 12:25:53 | → | use-value joins (~Thunderbi@2a00:23c6:8a03:2f01:29a1:b64:95d9:d66d) |
| 12:29:47 | × | jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 256 seconds) |
| 12:30:40 | → | InstX1 joins (~Liam@c-98-208-218-119.hsd1.fl.comcast.net) |
| 12:35:38 | × | InstX1 quits (~Liam@c-98-208-218-119.hsd1.fl.comcast.net) (Ping timeout: 256 seconds) |
| 12:40:26 | → | freeside joins (~mengwong@103.252.202.193) |
| 12:42:22 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 12:45:16 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 256 seconds) |
| 12:46:31 | × | robbert-vdh quits (~robbert@robbertvanderhelm.nl) (Ping timeout: 252 seconds) |
| 12:50:22 | × | CiaoSen quits (~Jura@p200300c95701f1002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 256 seconds) |
| 12:51:36 | → | liteyear joins (~liteyear@112.118.233.220.static.exetel.com.au) |
| 12:51:57 | → | freeside joins (~mengwong@103.252.202.193) |
| 12:52:13 | <liteyear> | Hi folks. Are you still accepting registrations for https://gitlab.haskell.org/haskell ? |
| 12:52:52 | <liteyear> | I’d like to contribute to an issue with ghcup I’ve been working on, but have been waiting for account registration approval for a week or two now. |
| 12:54:43 | <dminuoso> | liteyear: If available, you can also just signup with github |
| 12:54:51 | <dminuoso> | That works without any registration/activation |
| 12:55:17 | <dminuoso> | Or if in doubt, maybe poke bgamari. He ought to know |
| 12:55:22 | × | causal quits (~user@50.35.83.177) (Quit: WeeChat 3.7.1) |
| 12:55:29 | <probie> | Do you need approval? I'm pretty sure when I wanted to comment on an issue, I signed up within seconds |
| 12:56:02 | <dminuoso> | probie: I recall some bot registration spam issues. |
| 12:56:36 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 256 seconds) |
| 12:56:49 | → | ccapndave joins (~ccapndave@xcpe-62-167-164-99.cgn.res.adslplus.ch) |
| 13:00:44 | <liteyear> | Wish I’d done that first @dminuoso. Now if I try it claims my account is already registered! |
| 13:01:31 | <dminuoso> | Heh. |
| 13:01:40 | <dminuoso> | Yeah poke bgamari here or in #ghc |
| 13:02:19 | × | `2jt quits (~jtomas@191.red-88-17-199.dynamicip.rima-tde.net) (Ping timeout: 260 seconds) |
| 13:05:20 | → | freeside joins (~mengwong@103.252.202.193) |
| 13:05:40 | × | td_ quits (~td@83.135.9.50) (Ping timeout: 256 seconds) |
| 13:07:19 | × | Xeroine quits (~Xeroine@user/xeroine) (Quit: ZNC 1.8.2+deb2+b1 - https://znc.in) |
| 13:08:08 | → | Xeroine joins (~Xeroine@user/xeroine) |
| 13:08:21 | → | akegalj joins (~akegalj@210-96.dsl.iskon.hr) |
| 13:10:54 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 13:11:09 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 256 seconds) |
| 13:13:35 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 13:14:01 | → | lyle joins (~lyle@104.246.145.85) |
| 13:19:03 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Quit: = "") |
| 13:21:27 | → | freeside joins (~mengwong@103.252.202.193) |
| 13:21:45 | × | ccapndave quits (~ccapndave@xcpe-62-167-164-99.cgn.res.adslplus.ch) (Quit: My MacBook has gone to sleep. ZZZzzz…) |
| 13:23:48 | → | ccapndave joins (~ccapndave@xcpe-62-167-164-99.cgn.res.adslplus.ch) |
| 13:25:04 | × | ccapndave quits (~ccapndave@xcpe-62-167-164-99.cgn.res.adslplus.ch) (Client Quit) |
| 13:25:30 | → | ccapndave joins (~ccapndave@xcpe-62-167-164-99.cgn.res.adslplus.ch) |
| 13:26:42 | → | troydm joins (~troydm@host-176-37-124-197.b025.la.net.ua) |
| 13:27:16 | <akegalj> | When I try to run `foldl' (+) 0 . map snd . zip [1..] [1..1000000000]` over Int in ghci - it leaks memory. Seems like there is some sharing going on that I can't figure out. When compiled with ghc, it doesn't leak. Anyway There are 4 versions that I tried here https://paste.tomsmeding.com/vzgJNxQo and woo1 leaks. woo2 is polymorfic and it doesn't leak. woo4 is eta expanded and it doesn't leak. Why woo1, |
| 13:27:22 | <akegalj> | monomorfic eta reduced, version leaks in ghci? Why it doesn't leak when compiled with ghc? |
| 13:28:14 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds) |
| 13:28:55 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 260 seconds) |
| 13:29:21 | × | ccapndave quits (~ccapndave@xcpe-62-167-164-99.cgn.res.adslplus.ch) (Client Quit) |
| 13:31:02 | <merijn> | akegalj: ghci /= ghc |
| 13:31:10 | × | youziqi quits (~youziqi@103.37.140.25) (Ping timeout: 256 seconds) |
| 13:31:23 | <merijn> | akegalj: ghci compiles to bytecode and a whole slew of optimisations don't apply to bytecode |
| 13:31:41 | <merijn> | In general, ghci's behaviour is not representative of anything |
| 13:32:46 | <merijn> | So I wouldn't waste too much time attempting to reverse engineer it's behaviour |
| 13:33:14 | → | youziqi joins (~youziqi@103.37.140.122) |
| 13:33:38 | × | cafkafk quits (~cafkafk@fsf/member/cafkafk) (Ping timeout: 255 seconds) |
| 13:34:22 | <akegalj> | merijn: can i somehow turn off as much optimisations with ghc to see will it reproduce the behaviour. Is it -O0 ? |
| 13:34:36 | <merijn> | Possibly? Not sure |
| 13:35:13 | <akegalj> | marienz: anyway that makes sense |
| 13:35:15 | <akegalj> | thanks |
| 13:35:37 | <merijn> | for example, I don't think the strictness analyzer applies at all to ghci? |
| 13:36:58 | <akegalj> | merijn: I think that's true. Even with that - without optimisations, I was wondering why would it behave like that. If we compiled directly to stg without any optimisation ... |
| 13:37:27 | <akegalj> | anyway I thought there was a simple hand-wavey answer. If there isn't that's ok |
| 13:38:17 | <chreekat> | liteyear: yeah because of spam you have to get approved to get your account active. Best advice right now for anyone is to ask Ben or me in #ghc . What's the username? |
| 13:38:52 | <liteyear> | Thanks. I’ve poked bgamari and waiting on reply. Username is hraftery |
| 13:43:22 | <chreekat> | liteyear: user approved! bgamari: fyi |
| 13:44:32 | → | freeside joins (~mengwong@103.252.202.193) |
| 13:45:05 | × | Guest75 quits (~Guest75@178.141.130.118) (Quit: Client closed) |
| 13:45:22 | × | mei quits (~mei@user/mei) (Remote host closed the connection) |
| 13:45:48 | → | mei joins (~mei@user/mei) |
| 13:46:41 | → | beteigeuze1 joins (~Thunderbi@bl14-81-220.dsl.telepac.pt) |
| 13:46:46 | <liteyear> | Confirmed! Thanks chreekat |
| 13:48:53 | <chreekat> | np :) |
| 13:49:12 | → | king_gs joins (~Thunderbi@2806:103e:29:bfeb:c988:bbd5:2586:4924) |
| 13:49:18 | × | beteigeuze quits (~Thunderbi@bl14-81-220.dsl.telepac.pt) (Ping timeout: 256 seconds) |
| 13:49:18 | beteigeuze1 | is now known as beteigeuze |
| 13:51:34 | × | vglfr quits (~vglfr@145.224.100.22) (Ping timeout: 256 seconds) |
| 13:53:13 | × | beteigeuze quits (~Thunderbi@bl14-81-220.dsl.telepac.pt) (Remote host closed the connection) |
| 13:53:48 | → | nate4 joins (~nate@98.45.169.16) |
| 13:55:01 | → | beteigeuze joins (~Thunderbi@bl14-81-220.dsl.telepac.pt) |
| 13:56:40 | × | xff0x quits (~xff0x@2405:6580:b080:900:43db:c639:c914:6f0d) (Ping timeout: 252 seconds) |
| 13:57:53 | → | ccapndave joins (~ccapndave@mob-194-230-146-150.cgn.sunrise.net) |
| 13:58:52 | × | nate4 quits (~nate@98.45.169.16) (Ping timeout: 252 seconds) |
| 14:02:43 | × | lortabac quits (~lortabac@2a01:e0a:541:b8f0:158b:ea0c:943d:cbc4) (Ping timeout: 252 seconds) |
| 14:03:04 | <merijn> | hmm, I love when packages break backwards compat and it's completely unclear how to fix your code to work with the latest version |
| 14:09:36 | → | irrgit_ joins (~irrgit@86.106.90.226) |
| 14:10:05 | × | youziqi quits (~youziqi@103.37.140.122) (Ping timeout: 268 seconds) |
| 14:10:07 | → | xff0x joins (~xff0x@2405:6580:b080:900:43db:c639:c914:6f0d) |
| 14:10:53 | → | shriekingnoise joins (~shrieking@186.137.167.202) |
| 14:12:00 | × | ccapndave quits (~ccapndave@mob-194-230-146-150.cgn.sunrise.net) (Quit: My MacBook has gone to sleep. ZZZzzz…) |
| 14:12:52 | → | youziqi joins (~youziqi@103.37.140.45) |
| 14:15:04 | → | ccapndave joins (~ccapndave@mob-194-230-146-150.cgn.sunrise.net) |
| 14:17:07 | × | [Leary] quits (~Leary]@user/Leary/x-0910699) (Remote host closed the connection) |
| 14:17:36 | → | [Leary] joins (~Leary]@user/Leary/x-0910699) |
| 14:20:06 | × | __monty__ quits (~toonn@user/toonn) (Quit: leaving) |
| 14:27:27 | × | ec quits (~ec@gateway/tor-sasl/ec) (Remote host closed the connection) |
| 14:28:03 | × | ccapndave quits (~ccapndave@mob-194-230-146-150.cgn.sunrise.net) (Quit: My MacBook has gone to sleep. ZZZzzz…) |
| 14:28:49 | → | ccapndave joins (~ccapndave@mob-194-230-146-150.cgn.sunrise.net) |
| 14:32:22 | × | acidjnk quits (~acidjnk@p200300d6e7137a8274644e28d572a0cd.dip0.t-ipconnect.de) (Ping timeout: 256 seconds) |
| 14:32:36 | → | InstX1 joins (~Liam@c-98-208-218-119.hsd1.fl.comcast.net) |
| 14:32:59 | → | ec joins (~ec@gateway/tor-sasl/ec) |
| 14:33:41 | × | ccapndave quits (~ccapndave@mob-194-230-146-150.cgn.sunrise.net) (Quit: Textual IRC Client: www.textualapp.com) |
| 14:34:08 | × | liteyear quits (~liteyear@112.118.233.220.static.exetel.com.au) (Quit: liteyear) |
| 14:34:51 | → | lortabac joins (~lortabac@2a01:e0a:541:b8f0:77ea:1b0a:488a:bce4) |
| 14:40:47 | → | CiaoSen joins (~Jura@p200300c95701f1002a3a4dfffe84dbd5.dip0.t-ipconnect.de) |
| 14:46:43 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 252 seconds) |
| 14:51:23 | money | is now known as polo |
| 14:52:15 | → | jao joins (~jao@cpc103048-sgyl39-2-0-cust502.18-2.cable.virginm.net) |
| 14:59:57 | × | werneta quits (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) (Ping timeout: 256 seconds) |
| 15:01:48 | × | hiredman quits (~hiredman@frontier1.downey.family) (Remote host closed the connection) |
| 15:02:31 | × | wootehfoot quits (~wootehfoo@user/wootehfoot) (Ping timeout: 268 seconds) |
| 15:09:33 | → | bobbingbob joins (~bobbingbo@2604:3d09:207f:f650::b469) |
| 15:15:05 | → | robbert-vdh joins (~robbert@robbertvanderhelm.nl) |
| 15:16:00 | × | InstX1 quits (~Liam@c-98-208-218-119.hsd1.fl.comcast.net) (Ping timeout: 256 seconds) |
| 15:17:11 | → | freeside joins (~mengwong@103.252.202.193) |
| 15:18:55 | → | cstml joins (~cstml@user/cstml) |
| 15:20:20 | → | Sgeo joins (~Sgeo@user/sgeo) |
| 15:22:05 | × | califax quits (~califax@user/califx) (Ping timeout: 255 seconds) |
| 15:23:50 | × | bobbingbob quits (~bobbingbo@2604:3d09:207f:f650::b469) (Ping timeout: 260 seconds) |
| 15:25:13 | → | califax joins (~califax@user/califx) |
| 15:26:20 | → | ddellacosta joins (~ddellacos@143.244.47.83) |
| 15:27:56 | × | ec quits (~ec@gateway/tor-sasl/ec) (Ping timeout: 255 seconds) |
| 15:29:38 | × | king_gs quits (~Thunderbi@2806:103e:29:bfeb:c988:bbd5:2586:4924) (Remote host closed the connection) |
| 15:30:32 | → | ec joins (~ec@gateway/tor-sasl/ec) |
| 15:31:49 | → | acidjnk joins (~acidjnk@p200300d6e7137a338cbf33f376421589.dip0.t-ipconnect.de) |
| 15:33:36 | → | razetime joins (~quassel@117.193.6.245) |
| 15:42:04 | → | kenran joins (~user@user/kenran) |
| 15:46:50 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 15:54:09 | → | king_gs joins (~Thunderbi@2806:103e:29:bfeb:c988:bbd5:2586:4924) |
| 15:55:22 | × | cfricke quits (~cfricke@user/cfricke) (Quit: WeeChat 3.7.1) |
| 15:56:09 | × | Techcable quits (~Techcable@user/Techcable) (Ping timeout: 260 seconds) |
| 16:07:40 | → | cowboy8625 joins (~cowboy@96-2-208-2-static.midco.net) |
| 16:12:25 | → | cheater joins (~Username@user/cheater) |
| 16:16:32 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 16:16:33 | × | pavonia quits (~user@user/siracusa) (Quit: Bye!) |
| 16:20:20 | shapr` | is now known as shapr |
| 16:21:10 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 240 seconds) |
| 16:22:44 | × | razetime quits (~quassel@117.193.6.245) (Remote host closed the connection) |
| 16:23:37 | → | razetime joins (~quassel@117.193.6.245) |
| 16:25:08 | × | chromoblob quits (~user@37.113.164.122) (Ping timeout: 268 seconds) |
| 16:25:59 | → | eggplantade joins (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) |
| 16:26:22 | × | jespada quits (~jespada@nmal-24-b2-v4wan-166357-cust1764.vm24.cable.virginm.net) (Quit: Textual IRC Client: www.textualapp.com) |
| 16:27:39 | × | use-value quits (~Thunderbi@2a00:23c6:8a03:2f01:29a1:b64:95d9:d66d) (Remote host closed the connection) |
| 16:27:58 | → | use-value joins (~Thunderbi@2a00:23c6:8a03:2f01:75c2:a71f:beaa:29bf) |
| 16:29:05 | → | dfee joins (~dfee@cpe-66-75-25-89.san.res.rr.com) |
| 16:30:30 | × | son0p quits (~ff@181.136.122.143) (Read error: Connection reset by peer) |
| 16:31:09 | × | zeenk quits (~zeenk@2a02:2f04:a208:3600::7fe) (Quit: Konversation terminated!) |
| 16:33:34 | → | freeside joins (~mengwong@103.252.202.193) |
| 16:34:10 | × | CiaoSen quits (~Jura@p200300c95701f1002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 240 seconds) |
| 16:35:52 | → | CiaoSen joins (~Jura@p200300c95701f1002a3a4dfffe84dbd5.dip0.t-ipconnect.de) |
| 16:39:58 | × | dfee quits (~dfee@cpe-66-75-25-89.san.res.rr.com) (Quit: dfee) |
| 16:40:26 | × | CiaoSen quits (~Jura@p200300c95701f1002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 256 seconds) |
| 16:41:55 | × | coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot) |
| 16:43:23 | × | troydm quits (~troydm@host-176-37-124-197.b025.la.net.ua) (Ping timeout: 260 seconds) |
| 16:43:51 | × | king_gs quits (~Thunderbi@2806:103e:29:bfeb:c988:bbd5:2586:4924) (Ping timeout: 260 seconds) |
| 16:46:14 | → | king_gs joins (~Thunderbi@187.201.139.206) |
| 16:47:11 | → | `2jt joins (~jtomas@191.red-88-17-199.dynamicip.rima-tde.net) |
| 16:47:20 | → | bgs joins (~bgs@212-85-160-171.dynamic.telemach.net) |
| 16:48:20 | <Xeroine> | I want to make sure I understand the terminology, for example, in 'data Food = Con String Int' I'm creating a new data type which contains two fields, one can accept a string and the other an integer. Also if I afterwards do 'apple = Con "Apple" 3' I'm creating a new variable with Food type by using the constructor Con. Is this so far correct? |
| 16:48:46 | <merijn> | Xeroine: Correct |
| 16:48:48 | → | chromoblob joins (~user@37.113.164.122) |
| 16:49:05 | <Xeroine> | okay great |
| 16:49:11 | → | wootehfoot joins (~wootehfoo@user/wootehfoot) |
| 16:49:31 | <c_wraith> | I know what you mean, but I think "can accept" is a bit loose. It's more like "must be" |
| 16:49:56 | <merijn> | Well, if you wanna be pedantic you could say 'Con "Apple" 3' creates a value that you assign to the 'apple' variable |
| 16:51:20 | <merijn> | c_wraith: It depends, you can interpret "can accept" as exclusive or not (i.e. it can accept a string -> it can only accept a string), which is how I read it initially |
| 16:52:03 | <monochrom> | "must" = "can" plus implicit closed-world assumption :) |
| 16:52:07 | <c_wraith> | I think if you're describing them as fields, "must be" is accurate |
| 16:52:10 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 16:52:25 | <c_wraith> | on the other hand, if you're describing Con as a function, then yes, it can accept parameters |
| 16:52:30 | <Xeroine> | I knew they "must be" just misworded it I guess |
| 16:52:41 | <monochrom> | (A fine point that people who complain "people confuse 'if' with 'iff'" haven't thought of.) |
| 16:53:09 | <c_wraith> | Xeroine: yeah, I didn't think you were wrong. Just that the terminology was a bit loose. |
| 16:53:24 | <Xeroine> | in that Food type example Con is a type constructor, right? |
| 16:53:35 | <monochrom> | No. Data constructor. |
| 16:53:44 | <monochrom> | The type constructor is Foo. |
| 16:53:48 | <monochrom> | err, Food. |
| 16:54:01 | → | tzh joins (~tzh@c-24-21-73-154.hsd1.wa.comcast.net) |
| 16:54:04 | <Xeroine> | Food is also a constructor? I thought it's just a new type I'm creating |
| 16:54:08 | <merijn> | Xeroine: A type constructor is, well, a constructor of types (consider Maybe) |
| 16:54:10 | <monochrom> | IOW, Con is not a type. |
| 16:54:21 | <monochrom> | type constructor |
| 16:54:27 | <merijn> | Xeroine: As opposed to a data constructor which constructs data (i.e. values) |
| 16:54:41 | <monochrom> | You have created a type, so you have a type constructor, no? :) |
| 16:54:55 | <merijn> | Xeroine: Maybe is a type constructor because it constructs types, consider "Maybe Int" |
| 16:55:24 | <monochrom> | See, if you merely said "Con is a constructor", I would not have brought this up. |
| 16:55:49 | <monochrom> | But you brought up "type constructor" very verbosely, so let's do that. |
| 16:56:42 | <merijn> | Xeroine: The type level mirrors the value level to a large extent. So you can apply types to types and have (type) constructors, the same way you can apply values to values and have (value) constructors |
| 16:57:10 | <Xeroine> | I don't really know about Maybe yet |
| 16:57:21 | <merijn> | Unfortunate choice by me, then ;) |
| 16:57:54 | <monochrom> | Bool and Int, then. |
| 16:58:05 | <merijn> | Xeroine: If we have "data Bool = False | True" we have define 2 (value) constructors that have zero arguments |
| 16:58:20 | <merijn> | but we have *also* defined a (type) constructor (Bool) that has zero arguments |
| 16:58:49 | <merijn> | Xeroine: But Haskell has parameterised types to (think generics, if you know other languages like C#/java/whatever) |
| 16:59:12 | <monochrom> | Since these are values/data, not types: False, True, Con "hi" 3 |
| 16:59:33 | <monochrom> | therefore, you make data/values using False, True, Con. |
| 16:59:39 | <monochrom> | Therefore, they are data constructors. |
| 16:59:44 | <merijn> | So you have "data Maybe a = Nothing | Just a" which defines 1 (value) constructor with 0 arguments (Nothing), 1 (value) constructor with 1 argument (Just) and 1 (type) constructor with 1 argument (Maybe) |
| 16:59:50 | <monochrom> | They don't make types. They make values, data. |
| 17:03:30 | <monochrom> | Now, I fully understand that people prefer obviously wrong terminologies. |
| 17:03:56 | → | hiredman joins (~hiredman@frontier1.downey.family) |
| 17:04:14 | <monochrom> | Like, you are the person who edit your code, so you should be called the editor. But no, people prefer to call a certain stupid program the editor, even though you are the one doing all the work! |
| 17:05:33 | <Xeroine> | monochrom: you said that False, True are values which I understand but then "therefore, you make data/values using False, True, Con." so I can use True, False, etc. to create new values? What do you mean by that? |
| 17:06:03 | <merijn> | Xeroine: True is both a constructor and a value |
| 17:06:15 | <monochrom> | Con makes values, no? But I wouldn't commit about "new". |
| 17:06:19 | <merijn> | actually, we're all being sloppy now, since functions are also values |
| 17:07:04 | <monochrom> | And if you don't insist on "new", then "True is a value already" is also a special case of "True makes values too, just in the most trivial way". |
| 17:07:21 | <Xeroine> | merijn: I get how it's a value but how is it used to construct values? |
| 17:07:46 | <monochrom> | In fact, Con is also a value already. You can use it as a String->Int->Food function. |
| 17:08:11 | <merijn> | We need a word for non-function values ;) |
| 17:08:30 | <monochrom> | If some other function says "I want you to give me a String->Int->Food parameter", you can give Con. |
| 17:08:40 | <merijn> | Xeroine: Being a value and constructing a value are pretty interchangeable in Haskell |
| 17:08:56 | <Xeroine> | oh |
| 17:09:08 | <merijn> | Does 'Con "Apple" 3' *construct* a value or *is* it a value? |
| 17:09:30 | <merijn> | Xeroine: The distinction is pretty moot and unimportant in Haskell, since values are immutable and don't have a "location" or anything like that |
| 17:09:30 | <Xeroine> | both then? |
| 17:09:34 | <monochrom> | Bah I say that we don't need words for non-function values, non-zero numbers, non-square rectanges, non-radius-zero circles, non-function-type types, non-higher-order functions, ... |
| 17:09:40 | <merijn> | Xeroine: Both, neither, whatever you like :) |
| 17:09:50 | <monochrom> | non-empty lists... |
| 17:10:40 | × | akegalj quits (~akegalj@210-96.dsl.iskon.hr) (Quit: leaving) |
| 17:11:26 | <monochrom> | If you are obsessed with detailed steps of running a program, then you think "construct". "It didn't exist a moment ago, oh suddenly it exists now, so there must have been construction work". |
| 17:11:50 | <monochrom> | But if you accept that functional programming is about leveraging algebra skills, then you think "is". |
| 17:12:07 | <monochrom> | and "equals". |
| 17:12:44 | <Xeroine> | alright thanks |
| 17:19:04 | × | eggplantade quits (~Eggplanta@104-55-37-220.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection) |
| 17:20:24 | → | werneta joins (~werneta@70-142-214-115.lightspeed.irvnca.sbcglobal.net) |
| 17:20:52 | × | razetime quits (~quassel@117.193.6.245) (Remote host closed the connection) |
| 17:21:23 | × | kenran quits (~user@user/kenran) (Remote host closed the connection) |
| 17:22:09 | → | shelby joins (~thomas_sh@115.96.219.9) |
| 17:23:25 | <shelby> | hi.. is there a detailed web development tutorial for beginners using haskell.. ? I have seen a few which are either very old or jump through a lot of steps which i dont understand |
| 17:24:28 | <geekosaur> | sadly I'd have to say webdev is not a good place to start; all the webdev stuff is pretty heavily into type level programming |
| 17:25:07 | <c_wraith> | there are lots of web libraries that don't do type-level stuff. But they all assume you know how the web works. |
| 17:25:54 | <c_wraith> | They all assume you know how HTTP works |
| 17:25:58 | <Rembane> | Scotty is quite alright for small things imo, but it takes about fifteen minutes before a monad transformer stack is needed. |
| 17:26:11 | <shelby> | :) |
| 17:26:19 | × | coldtom quits (~coldtom@coldrick.cc) (Quit: Well, that's got rid of me) |
| 17:26:26 | <shelby> | how about anything related to data science in haskell? |
| 17:26:33 | → | jespada joins (~jespada@nmal-24-b2-v4wan-166357-cust1764.vm24.cable.virginm.net) |
| 17:26:37 | <shelby> | what are the normal projects beginners start with.. ? |
| 17:26:43 | <shelby> | I am using lyah |
| 17:27:02 | <shelby> | i also have Prof graham huttons book .. tic tac toe examples.. |
| 17:27:03 | <Rembane> | I like building interpreters in Haskell, it can be kinda well contained. Parsers are also nice, but a bit more fiddly. |
| 17:27:08 | → | coldtom joins (~coldtom@coldrick.cc) |
| 17:27:11 | × | kuribas quits (~user@ip-188-118-57-242.reverse.destiny.be) (Quit: ERC (IRC client for Emacs 27.1)) |
| 17:27:52 | <shelby> | nothing against it but not able to use it anywhere.. eg a simple web form for data collection.. comes across as too difficult in haskell |
| 17:28:10 | <merijn> | shelby: The visualisation side of data science-y stuff is a bit messy, but the *processing* side is really nice |
| 17:28:33 | <shelby> | taking iris data set and coming up with any kind of viz - again an issue.. |
| 17:28:45 | <merijn> | shelby: In my own code I have completely trivial and dumb gnuplot/matplotlib scripts that I call from Haskell with all the data processing in Haskell |
| 17:28:57 | <shelby> | what do people use it for? small simple use cases? |
| 17:29:39 | <merijn> | shelby: about 70-80% of the code for the experiments in my phd thesis was Haskell, including all the data management, job scheduling, analysis, etc. |
| 17:29:44 | × | chromoblob quits (~user@37.113.164.122) (Ping timeout: 256 seconds) |
| 17:29:55 | → | kenran joins (~user@user/kenran) |
| 17:30:01 | <shelby> | ok.. i know a bit of R.. not matplot lib.. |
| 17:30:16 | ← | jakalx parts (~jakalx@base.jakalx.net) (Error from remote client) |
| 17:30:17 | <merijn> | matplotlib is absolutely awful anyway |
| 17:30:31 | <merijn> | Shouldn't be too hard to feed data into an R script instead |
| 17:30:35 | <shelby> | somewhere i am not able to cross from text book to practical projects in haskell.. any one else feel the same? |
| 17:30:50 | × | Major_Biscuit quits (~MajorBisc@c-001-001-039.client.tudelft.eduvpn.nl) (Ping timeout: 240 seconds) |
| 17:30:58 | → | jakalx joins (~jakalx@base.jakalx.net) |
| 17:31:15 | <merijn> | shelby: tbh, if you're reading LYAH that's pretty understandable it's not a great book, in the sense that it shows lots of neat things, but doesn't really teach you how to *do* things |
| 17:31:28 | <shelby> | yes |
| 17:31:36 | <merijn> | Hutton's book should be much better |
| 17:31:56 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:3cb4:cd70:33e6:e916) |
| 17:32:00 | <shelby> | so i took up huttons book.. it is definitely better.. but still academic.. most of it is in the interactive mode.. |
| 17:32:14 | <shelby> | does not get into a project mode.. |
| 17:32:46 | <shelby> | multiple files / modules.. DB interaction.. etc.. |
| 17:32:55 | → | chromoblob joins (~user@37.113.164.122) |
| 17:33:39 | <merijn> | shelby: Do you know any other languages or is Haskell the first? |
| 17:33:42 | × | nschoe quits (~q@141.101.51.197) (Ping timeout: 256 seconds) |
| 17:34:35 | <shelby> | R |
| 17:34:40 | <shelby> | a bit of ruby |
| 17:35:46 | <merijn> | a lot of the module organisation, etc. is mostly the same as any other language, tbh |
| 17:36:24 | <shelby> | i understand.. but things break far too often and then you end up going down a different rabbit hole :) |
| 17:36:26 | <merijn> | as for database interaction, the simplest things to get started with are things like sqlite-simple and postgres-simple which are fairly self-explanatory compared to database bindings in imperative languages |
| 17:37:08 | <Franciman> | is it possible to have a pure language perform SQL queries? Or is the monad necessary in any case? |
| 17:37:10 | <merijn> | There's stuff like Selda for higher level database stuff, but I'm not completely sold on that whole approach |
| 17:37:24 | <Franciman> | ah probably to handle failures of the connection :/ |
| 17:37:30 | <Franciman> | and opening the connection too |
| 17:38:16 | → | irrgit__ joins (~irrgit@146.70.27.250) |
| 17:41:04 | × | irrgit_ quits (~irrgit@86.106.90.226) (Ping timeout: 256 seconds) |
| 17:41:24 | → | Tuplanolla joins (~Tuplanoll@91-159-68-152.elisa-laajakaista.fi) |
| 17:42:34 | × | wagle quits (~wagle@quassel.wagle.io) (Quit: http://quassel-irc.org - Chat comfortably. Anywhere.) |
| 17:42:46 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 256 seconds) |
| 17:42:50 | × | kenran quits (~user@user/kenran) (Remote host closed the connection) |
| 17:42:58 | → | econo joins (uid147250@user/econo) |
| 17:43:03 | → | wagle joins (~wagle@quassel.wagle.io) |
| 17:44:05 | × | titibandit quits (~titibandi@xdsl-78-35-182-184.nc.de) (Remote host closed the connection) |
| 17:45:34 | × | lortabac quits (~lortabac@2a01:e0a:541:b8f0:77ea:1b0a:488a:bce4) (Quit: WeeChat 2.8) |
| 17:52:24 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 17:55:03 | × | zaquest quits (~notzaques@5.130.79.72) (Ping timeout: 256 seconds) |
| 17:55:14 | <vpan> | shelby: I understand you very well. I started with LYAH myself and only realised halfway through it that it's not considered great by the community. Finished it anyway and I'm now reading https://www.manning.com/books/haskell-in-depth . Don't really have much to compare it against, but it covers many practical aspects and walks through some small sample projects (code is on GitHub), so I'm happy with it so far. |
| 17:55:18 | → | nate4 joins (~nate@98.45.169.16) |
| 17:56:09 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 17:57:59 | → | mvk joins (~mvk@2607:fea8:5ce3:8500::4b68) |
| 17:59:26 | → | freeside joins (~mengwong@103.252.202.193) |
| 18:00:23 | × | nate4 quits (~nate@98.45.169.16) (Ping timeout: 260 seconds) |
| 18:00:31 | × | shelby quits (~thomas_sh@115.96.219.9) (Remote host closed the connection) |
| 18:04:07 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 256 seconds) |
| 18:05:16 | → | ft joins (~ft@p508dbd59.dip0.t-ipconnect.de) |
| 18:06:59 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 18:10:57 | × | enoq quits (~enoq@2a05:1141:1f5:5600:b9c9:721a:599:bfe7) (Quit: enoq) |
| 18:11:12 | → | freeside joins (~mengwong@103.252.202.193) |
| 18:14:32 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 18:14:38 | → | zaquest joins (~notzaques@5.130.79.72) |
| 18:16:05 | polo | is now known as money |
| 18:16:11 | × | king_gs quits (~Thunderbi@187.201.139.206) (Read error: Connection reset by peer) |
| 18:16:12 | × | fserucas quits (~fserucas@2001:8a0:6d00:2500:4717:7619:c4e9:3aa2) (Quit: Leaving) |
| 18:16:58 | → | king_gs joins (~Thunderbi@2806:103e:29:bfeb:c988:bbd5:2586:4924) |
| 18:17:06 | → | coot joins (~coot@213.134.171.3) |
| 18:18:41 | × | stiell quits (~stiell@gateway/tor-sasl/stiell) (Remote host closed the connection) |
| 18:20:01 | → | stiell joins (~stiell@gateway/tor-sasl/stiell) |
| 18:21:10 | × | irrgit__ quits (~irrgit@146.70.27.250) (Ping timeout: 240 seconds) |
| 18:22:42 | → | emcee50 joins (~emcee@rrcs-24-43-123-72.west.biz.rr.com) |
| 18:24:10 | <emcee50> | is there a recommendation for which package to use between cmdargs and optparse-applicative for parsing cli arguments? |
| 18:24:21 | → | srz joins (~srz@181.228.49.93) |
| 18:25:58 | <sm> | I like cmdargs; o-a is more popular |
| 18:26:21 | <geekosaur> | each has its proponents |
| 18:26:40 | <geekosaur> | I suggest playing with both and using the one you like more |
| 18:27:31 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 18:28:07 | <emcee50> | sm: is there a single reason why you prefer cmdargs? |
| 18:28:25 | <sm> | no, several |
| 18:29:23 | → | irrgit_ joins (~irrgit@89.47.234.74) |
| 18:29:32 | <emcee50> | hmmm i suppose i'll just pick one and see how i like it. my use case is pretty simple. thanks for the input, all. |
| 18:29:33 | × | mbuf quits (~Shakthi@49.204.115.42) (Quit: Leaving) |
| 18:29:46 | <sm> | the name, the docs, easier to figure out, monolithic vs a confusing ecosystem, accepts partial flags, inertia |
| 18:30:27 | <emcee50> | lol yeah optparse-applicative is truly a Haskell Name |
| 18:32:13 | <emcee50> | I suppose I'll give cmdargs a try then, thanks for the summary. |
| 18:33:02 | <sm> | maybe an o-a user who has tried cmdargs can give their reasons |
| 18:34:58 | × | beteigeuze quits (~Thunderbi@bl14-81-220.dsl.telepac.pt) (Ping timeout: 252 seconds) |
| 18:37:17 | × | vpan quits (~0@212.117.1.172) (Quit: Leaving.) |
| 18:43:25 | → | beteigeuze joins (~Thunderbi@bl14-81-220.dsl.telepac.pt) |
| 18:47:30 | × | beteigeuze quits (~Thunderbi@bl14-81-220.dsl.telepac.pt) (Ping timeout: 240 seconds) |
| 18:49:43 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 18:50:21 | <merijn> | emcee50: Counter point, I wildly prefer optparse-applicative :p |
| 18:51:06 | <merijn> | I haven't used cmdargs, but did look into it. And overally the most important factor in not using cmdargs is: too much magic |
| 18:51:10 | → | caryhartline joins (~caryhartl@2600:1700:2d0:8d30:3193:f3f8:77d4:386c) |
| 18:52:56 | <merijn> | Since it was basically all the implicit interface. The explicit interface is better, but otoh the explicit interface isn't super different from optparse |
| 18:54:01 | <emcee50> | i can see what you're saying, comparing the docs |
| 18:54:13 | <dsal> | I used optparse-generic once, but generally prefer optparse-applicative. |
| 18:54:30 | <merijn> | optparse also "scales better" in the sense that "writing a very simple parser" is easy enough, maybe a bit verboser than cmdargs and other alternatives, but you can go as big as you complex as you want |
| 18:55:50 | <dsal> | Yeah, optparse-applicative lets you do cool stuff like this, and will do neat things with bash like generation completions and junk. https://www.irccloud.com/pastebin/qgFfWhku/optparse.txt |
| 18:56:01 | <merijn> | I have a (well, several, I suppose) pretty giant CLI parser(s) in it including stuff like dynamic bash completion and what not |
| 18:56:24 | <dsal> | That wasn't the best example, but it'll try to get pretty close if you make a spelling error or something. |
| 18:56:30 | <merijn> | custom completion, customizable help rendering, etc. is all pretty nice |
| 18:56:54 | <dsal> | Like this: https://www.irccloud.com/pastebin/BDXeqzed/list.txt |
| 18:56:55 | <merijn> | And it's nice that you can start super basic and "grow into it" in terms of complicated features |
| 18:57:14 | → | jmdaemon joins (~jmdaemon@user/jmdaemon) |
| 18:58:12 | <monochrom> | optparse-applicative does need better explanations and probably should not have been so abstract in the first place. |
| 18:58:30 | <dsal> | Are you advocating for optparse-functor? |
| 18:58:41 | <merijn> | dsal: Naah, that'd syck |
| 18:58:43 | <monochrom> | No. |
| 18:58:44 | <merijn> | *suck |
| 18:58:46 | <emcee50> | Thanks for the input merijn and dsal regarding optparse-applicative! I suppose like was suggested before that I'll check both out |
| 18:58:51 | <merijn> | monochrom: Abstract in what sense? |
| 18:59:34 | <dsal> | optparse-generic looks kind of neat, but it's not super flexible. It's good at doing the things it's good at doing and if you're just doing those things, you're good. |
| 18:59:41 | <sm> | at the other end of the spectrum, docopt is very handy if you can deal with its limitations |
| 18:59:55 | <emcee50> | i think they should adopt optparse-zyghistomorphicprepromorphism myself |
| 19:01:07 | <monochrom> | In the same sense as, though not as severe as, regex-base in going so overboard with type classes. |
| 19:01:19 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 19:01:33 | <monochrom> | I do not mean that the applicative idea is too abstract. |
| 19:02:17 | → | DDR joins (~DDR@2604:3d08:4c7f:8250:7257:f6a:ab73:6e5d) |
| 19:02:59 | <merijn> | monochrom: The classes are almost never really something you have to deal with in the API, though |
| 19:03:25 | <monochrom> | https://hackage.haskell.org/package/options shows that you can have the applicative way and still not going overboard with so many, um, options. |
| 19:03:51 | × | c0c0 quits (~coco@85.195.206.136) (Quit: WeeChat 3.5) |
| 19:04:21 | <monochrom> | That's not how I experienced optparse-applicative. |
| 19:04:32 | <cstml> | fwiw. optparse-applicative is my no-brainer choice. Simple, and easy to scale. |
| 19:05:23 | <merijn> | My main complaint is the default "style" used by the author in examples is much more verbose and complicated looking than using "mconcat on lists" |
| 19:05:56 | × | eggplantade quits (~Eggplanta@2600:1700:38c5:d800:3cb4:cd70:33e6:e916) (Remote host closed the connection) |
| 19:05:59 | → | td_ joins (~td@83.135.9.50) |
| 19:06:35 | <cstml> | imo. better to have comprehensive examples - rather than trivial ones. Best is both. |
| 19:06:54 | <monochrom> | Either that or you could argue that the highly generalized type classes are a really good idea but it's the docs that are obtuse. |
| 19:08:33 | <merijn> | tbh, the classes should just not be listed in the docs, since they're mostly internal |
| 19:08:39 | <monochrom> | I mean, I figured them out quickly, sure. (I even figured out regex-base.) But I am also a teacher, and I see that from that angle it totally fails. |
| 19:13:49 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 256 seconds) |
| 19:14:11 | × | sammelweis quits (~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10) (Read error: Connection reset by peer) |
| 19:15:21 | → | sammelweis joins (~quassel@2601:401:8200:2d4c:bd9:d04c:7f69:eb10) |
| 19:17:54 | <merijn> | cstml: My point was more that the same example could be written cleaner and less intimidating looking with some use of mconcat :p |
| 19:18:19 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:3cb4:cd70:33e6:e916) |
| 19:19:10 | → | Guest47 joins (~Guest47@110.226.84.78) |
| 19:19:25 | × | Guest47 quits (~Guest47@110.226.84.78) (Client Quit) |
| 19:19:43 | <monochrom> | And just now I'm coming across https://hackage.haskell.org/package/optparse-declarative so you write your option specification at the type-level... :) |
| 19:19:59 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 19:20:50 | × | `2jt quits (~jtomas@191.red-88-17-199.dynamicip.rima-tde.net) (Ping timeout: 240 seconds) |
| 19:20:54 | <merijn> | monochrom: That...sounds like a nightmare |
| 19:21:35 | <monochrom> | The example use cases look alright. |
| 19:22:11 | <monochrom> | The type looks long but if you use other libraries you have long values instead. Same length. |
| 19:22:40 | <monochrom> | Analogous structure too. |
| 19:22:44 | <cstml> | merijn: If you consider it would make a big difference, it's worth opening a PR against the documentation and proposing a change to it. Personally I like the look of (<>) ~ reminiscent of "lens'ing". |
| 19:24:08 | <monochrom> | OK, I see that the type-level way requires remembering parameter order, the applicative way doesn't. |
| 19:25:28 | × | ubert quits (~Thunderbi@77.119.167.253.wireless.dyn.drei.com) (Read error: Connection reset by peer) |
| 19:25:28 | ub | is now known as ubert |
| 19:25:47 | → | ubert1 joins (~Thunderbi@77.119.167.253.wireless.dyn.drei.com) |
| 19:26:07 | <mauke> | how do I spec cat(1) with this? |
| 19:26:40 | → | Guest12 joins (~Guest12@110.226.84.78) |
| 19:26:49 | <monochrom> | I am too lazy to find out. :) |
| 19:27:29 | <mauke> | it doesn't look possible |
| 19:29:55 | <cstml> | mauke: wdym? - you think it's impossible to spec https://man7.org/linux/man-pages/man1/cat.1.html with `optparse-applicative`? |
| 19:30:21 | <mauke> | no, optparse-declarative |
| 19:30:38 | <mauke> | "If the input is [], it indicates the option does not have an argument; otherwise the input is a list of a single String." <- ??? |
| 19:32:10 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 19:32:33 | <cstml> | mauke: oh, ok. No idea. |
| 19:33:12 | × | eggplantade quits (~Eggplanta@2600:1700:38c5:d800:3cb4:cd70:33e6:e916) (Remote host closed the connection) |
| 19:34:08 | <merijn> | :O |
| 19:36:18 | × | Guest12 quits (~Guest12@110.226.84.78) (Ping timeout: 260 seconds) |
| 19:36:24 | → | freeside joins (~mengwong@103.252.202.193) |
| 19:36:47 | × | emcee50 quits (~emcee@rrcs-24-43-123-72.west.biz.rr.com) (Quit: Client closed) |
| 19:38:03 | <mauke> | the main problems I see: cat takes valueless options like -n; o-d doesn't support that (maybe? documentation is unclear) |
| 19:38:36 | <mauke> | cat takes an arbitrary list of non-option arguments; also not supported |
| 19:39:05 | → | dfee joins (~dfee@cpe-70-95-143-62.san.res.rr.com) |
| 19:39:16 | <mauke> | finally, cat has a -v option but o-d insists on predefining a "verbose" option with shorthand -v |
| 19:41:09 | <sm> | there are a lot of variations in command line parsing behaviour and I think no one lib supports them all |
| 19:41:14 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 268 seconds) |
| 19:41:39 | <sm> | cmdargs can't easily support flags with an optional argument, eg |
| 19:42:24 | → | troydm joins (~troydm@host-176-37-124-197.b025.la.net.ua) |
| 19:45:57 | × | mei quits (~mei@user/mei) (Remote host closed the connection) |
| 19:47:22 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 19:47:23 | × | Vajb quits (~Vajb@2001:999:504:3ad6:52a4:a3b5:32d8:e74d) (Read error: Connection reset by peer) |
| 19:48:00 | → | Vajb joins (~Vajb@hag-jnsbng11-58c3a5-27.dhcp.inet.fi) |
| 19:50:08 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:3cb4:cd70:33e6:e916) |
| 19:51:55 | × | raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 260 seconds) |
| 19:54:22 | → | freeside joins (~mengwong@103.252.202.193) |
| 20:00:25 | → | mei joins (~mei@user/mei) |
| 20:03:07 | × | cstml quits (~cstml@user/cstml) (Ping timeout: 256 seconds) |
| 20:07:50 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 20:07:57 | → | remedan_ joins (~remedan@octo.cafe) |
| 20:08:30 | × | remedan quits (~remedan@octo.cafe) (Ping timeout: 260 seconds) |
| 20:08:37 | → | Philonous_ joins (~Philonous@user/philonous) |
| 20:09:05 | × | Philonous quits (~Philonous@user/philonous) (Ping timeout: 260 seconds) |
| 20:11:32 | × | Vajb quits (~Vajb@hag-jnsbng11-58c3a5-27.dhcp.inet.fi) (Read error: Connection reset by peer) |
| 20:12:21 | → | Vajb joins (~Vajb@2001:999:504:3ad6:52a4:a3b5:32d8:e74d) |
| 20:15:37 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Quit: ZNC - https://znc.in) |
| 20:16:17 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 20:16:20 | × | shapr quits (~user@2601:7c0:c383:70:87f8:8431:4c:ee0) (Ping timeout: 256 seconds) |
| 20:16:24 | → | Erutuon joins (~Erutuon@user/erutuon) |
| 20:19:02 | → | gmg joins (~user@user/gehmehgeh) |
| 20:20:37 | → | cstml joins (~cstml@cpc151611-shef16-2-0-cust313.17-1.cable.virginm.net) |
| 20:22:10 | × | cheater quits (~Username@user/cheater) (Remote host closed the connection) |
| 20:22:50 | × | cstml quits (~cstml@cpc151611-shef16-2-0-cust313.17-1.cable.virginm.net) (Client Quit) |
| 20:23:58 | → | cheater joins (~Username@user/cheater) |
| 20:24:10 | × | king_gs quits (~Thunderbi@2806:103e:29:bfeb:c988:bbd5:2586:4924) (Ping timeout: 240 seconds) |
| 20:30:02 | × | lyle quits (~lyle@104.246.145.85) (Quit: WeeChat 3.7.1) |
| 20:32:01 | → | cstml joins (cstml@user/cstml) |
| 20:34:55 | → | InstX1 joins (~Liam@c-98-208-218-119.hsd1.fl.comcast.net) |
| 20:36:11 | × | gmg quits (~user@user/gehmehgeh) (Ping timeout: 255 seconds) |
| 20:36:17 | → | pavonia joins (~user@user/siracusa) |
| 20:37:07 | → | gmg joins (~user@user/gehmehgeh) |
| 20:38:01 | <Xeroine> | I don't really understand what that problem is when installing with cabal. Here's the error messages I'm getting https://bpa.st/C3QQ |
| 20:38:40 | <Xeroine> | This is in a fresh ~/.cabal, I only ran "cabal update" in it |
| 20:38:41 | <geekosaur> | "conflict: pkg-config |
| 20:38:41 | <geekosaur> | package librsvg-2.0==2.16.0 || >2.16.0, not found in the pkg-config database" |
| 20:39:00 | <geekosaur> | you need to install the OS librsvg-2.0 package |
| 20:39:21 | <geekosaur> | (pkg-config is a package tracker for C/C++ libraries) |
| 20:39:43 | → | akegalj joins (~akegalj@210-96.dsl.iskon.hr) |
| 20:39:49 | × | InstX1 quits (~Liam@c-98-208-218-119.hsd1.fl.comcast.net) (Ping timeout: 268 seconds) |
| 20:39:55 | <Xeroine> | oh, I was about to ask if it's complaining that it's missing or because it's installed and it's causing some kind of conflict |
| 20:39:55 | <geekosaur> | you also need the devel library, if your OS makes that distinction (debian and fedora do, arch doesn't) |
| 20:40:55 | × | Bish quits (~arne@ip-078-094-082-081.um19.pools.vodafone-ip.de) (Quit: leaving) |
| 20:41:35 | <geekosaur> | on my ubuntu system, this meands "sudo apt install librsvg2-dev" |
| 20:42:24 | <Xeroine> | yeah I got it and looks like it's instaling ghc-vis now |
| 20:42:51 | <Xeroine> | thanks |
| 20:43:18 | → | king_gs joins (~Thunderbi@187.201.139.206) |
| 20:45:49 | × | dequbed quits (~dequbed@banana-new.kilobyte22.de) (Quit: bye!) |
| 20:50:15 | × | srz quits (~srz@181.228.49.93) (Ping timeout: 260 seconds) |
| 20:53:05 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 20:53:21 | → | shapr joins (~user@68.54.166.125) |
| 20:53:48 | → | titibandit joins (~titibandi@xdsl-78-35-182-184.nc.de) |
| 20:56:53 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 255 seconds) |
| 20:58:19 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 268 seconds) |
| 21:03:10 | → | king_gs1 joins (~Thunderbi@2806:103e:29:bfeb:c988:bbd5:2586:4924) |
| 21:03:11 | × | king_gs quits (~Thunderbi@187.201.139.206) (Read error: Connection reset by peer) |
| 21:03:11 | king_gs1 | is now known as king_gs |
| 21:05:14 | → | polo_ joins (~polo@pool-100-11-18-203.phlapa.fios.verizon.net) |
| 21:05:24 | × | fockerize quits (~finn@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr) (Ping timeout: 248 seconds) |
| 21:06:20 | × | califax quits (~califax@user/califx) (Remote host closed the connection) |
| 21:06:45 | × | coot quits (~coot@213.134.171.3) (Quit: coot) |
| 21:08:29 | → | califax joins (~califax@user/califx) |
| 21:11:22 | → | freeside joins (~mengwong@103.252.202.193) |
| 21:12:59 | → | stef204 joins (~stef204@user/stef204) |
| 21:15:05 | × | polo_ quits (~polo@pool-100-11-18-203.phlapa.fios.verizon.net) (Ping timeout: 256 seconds) |
| 21:15:44 | → | polo_ joins (~polo@pool-100-11-18-203.phlapa.fios.verizon.net) |
| 21:15:55 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 260 seconds) |
| 21:16:45 | × | eggplantade quits (~Eggplanta@2600:1700:38c5:d800:3cb4:cd70:33e6:e916) (Remote host closed the connection) |
| 21:19:29 | × | wootehfoot quits (~wootehfoo@user/wootehfoot) (Read error: Connection reset by peer) |
| 21:20:22 | × | polo_ quits (~polo@pool-100-11-18-203.phlapa.fios.verizon.net) (Changing host) |
| 21:20:22 | → | polo_ joins (~polo@user/polo) |
| 21:20:27 | money | is now known as Guest5270 |
| 21:20:27 | polo_ | is now known as money |
| 21:20:42 | ← | jakalx parts (~jakalx@base.jakalx.net) () |
| 21:21:07 | → | Techcable joins (~Techcable@user/Techcable) |
| 21:21:32 | → | gqplox joins (~textual@2a02:c7c:941d:fd00:c91:4591:f163:6ae7) |
| 21:23:25 | × | money quits (~polo@user/polo) (Quit: Late) |
| 21:23:36 | <gqplox> | hi guys |
| 21:24:02 | × | king_gs quits (~Thunderbi@2806:103e:29:bfeb:c988:bbd5:2586:4924) (Remote host closed the connection) |
| 21:24:21 | → | king_gs joins (~Thunderbi@2806:103e:29:bfeb:c988:bbd5:2586:4924) |
| 21:24:22 | <gqplox> | http://sprunge.us/wgU8sP |
| 21:25:53 | → | bobbingbob joins (~bobbingbo@2604:3d09:207f:f650::b469) |
| 21:26:42 | → | fockerize joins (~finn@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr) |
| 21:26:55 | <geekosaur> | yes? |
| 21:27:46 | → | jakalx joins (~jakalx@base.jakalx.net) |
| 21:28:14 | <geekosaur> | (I do wonder if you'd have problems because "Main" is a special module name; might need some extra foo to prevent ghc from misreading it as a qualified name) |
| 21:28:19 | → | polo joins (~polo@user/polo) |
| 21:29:54 | <gqplox> | im having some trouble with this maxBound |
| 21:29:57 | <gqplox> | minBound sorry |
| 21:30:34 | <gqplox> | I want to make a function that will say print all the items in teh data class for any given Data which has bounded show and enum |
| 21:30:56 | → | beteigeuze joins (~Thunderbi@a79-169-109-107.cpe.netcabo.pt) |
| 21:32:32 | <geekosaur> | sounds like you pretty much described such a function |
| 21:32:45 | <geekosaur> | start with the type signature |
| 21:33:44 | <gqplox> | printAllMembers :: (Bounded a, Show a, Enum a) => a -> String |
| 21:37:24 | × | merijn quits (~merijn@86-86-29-250.fixed.kpn.net) (Ping timeout: 248 seconds) |
| 21:37:34 | × | califax quits (~califax@user/califx) (Remote host closed the connection) |
| 21:38:00 | <geekosaur> | okay, with one caveat: `a` is a value, you can't specify the data type there unlike with an OO language |
| 21:38:08 | → | freeside joins (~mengwong@103.252.202.193) |
| 21:38:18 | → | noodstudent joins (~AdminUser@137.220.72.94) |
| 21:38:21 | <geekosaur> | also it'd only be used to specify the type. there are ways around that but they're all advanced topics |
| 21:38:33 | → | califax joins (~califax@user/califx) |
| 21:40:56 | × | jlgw quits (~jw@83-233-104-81.cust.bredband2.com) (Remote host closed the connection) |
| 21:41:11 | <gqplox> | minBound is Bounded a => a |
| 21:41:59 | <geekosaur> | yes. so you have to specify its type, not pass it a parameter |
| 21:42:14 | <geekosaur> | have you been introduced to asTypeOf yet? |
| 21:42:22 | × | cowboy8625 quits (~cowboy@96-2-208-2-static.midco.net) (Quit: WeeChat 3.5) |
| 21:42:45 | geekosaur | is trying to figure out what solution is intended |
| 21:43:11 | <gqplox> | no I haven't |
| 21:43:19 | <geekosaur> | perhaps you can provide the original wording of the problem. yours wasn't it, since "data class" isn't a thing |
| 21:44:27 | <gqplox> | ok sorry i tried to make up my own problem |
| 21:45:14 | <gqplox> | so I can do allDrinks:: [Drink] and then allDrinks = [mindBound ..] is fine, and then showAllDrinks = map show allDrinks |
| 21:45:31 | <gqplox> | but if i want to do it all in one function im struggling with that |
| 21:45:48 | <gqplox> | what do you mean by specify its type |
| 21:45:48 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 268 seconds) |
| 21:46:14 | <mauke> | map show [(minBound :: Drink) ..] |
| 21:46:15 | <gqplox> | like showAllDrinks' Drink -> String |
| 21:46:24 | × | dfee quits (~dfee@cpe-70-95-143-62.san.res.rr.com) (Read error: Connection reset by peer) |
| 21:46:29 | × | polo quits (~polo@user/polo) (Quit: resegt) |
| 21:47:24 | <geekosaur> | here's one way to write a function that can do it for any type that has Bounded, Enum, and Show instances |
| 21:47:33 | <geekosaur> | allOf x = intercalate ", " (map show [minBound `asTypeOf` x .. maxBound]) |
| 21:47:43 | <geekosaur> | (intercalate is in Data.List) |
| 21:48:12 | <geekosaur> | but you have to give it a value of the type; you can't (currently) give it a type directly |
| 21:48:23 | <gqplox> | okay right |
| 21:48:37 | <gqplox> | yeah I think I was thinking about it wrong |
| 21:48:40 | → | freeside joins (~mengwong@103.252.202.193) |
| 21:48:58 | <geekosaur> | there are other ways to do it, like using Proxy or a type application, but those are more advanced techniques |
| 21:49:21 | <geekosaur> | and a proxy would still require asTypeOf to "extract" the type |
| 21:50:02 | <geekosaur> | hm, no it wouldn't |
| 21:50:29 | × | hgolden quits (~hgolden@cpe-172-251-233-141.socal.res.rr.com) (Remote host closed the connection) |
| 21:50:43 | → | polo joins (~polo@user/polo) |
| 21:50:43 | <geekosaur> | allOfP :: (Bounded a, Enum a, Show a) => Proxy a -> String, then use minBound :: a |
| 21:51:00 | <gqplox> | http://sprunge.us/rFq8XL |
| 21:51:04 | <gqplox> | this was the original thing |
| 21:51:06 | <mauke> | are you mixing up scoped type variables and proxy? |
| 21:51:10 | <geekosaur> | and invoke it as allOfP (Proxy Drinks) or similar |
| 21:51:26 | <geekosaur> | probably |
| 21:51:36 | <geekosaur> | in any case it's probably not beginner-level fare |
| 21:51:37 | <gqplox> | i saw this example about data and i thought how to show all possible saver menus |
| 21:51:53 | <mauke> | > [False ..] |
| 21:51:55 | <lambdabot> | [False,True] |
| 21:52:02 | → | hgolden joins (~hgolden@cpe-172-251-233-141.socal.res.rr.com) |
| 21:52:25 | geekosaur | is kinda having a poor day |
| 21:52:45 | <gqplox> | and then at the end i saw i repeated allMains, all Drinks and thought how can i reduce that and make it more general thts why i was asking |
| 21:52:53 | <gqplox> | how do you do that |
| 21:53:08 | <mauke> | printList xs = concatMap (\x -> show x ++ "\n") |
| 21:53:09 | <gqplox> | in my irc i see * geeosaur is kinda having a poor day |
| 21:53:11 | <gqplox> | instead of the test |
| 21:53:16 | <mauke> | er, without xs |
| 21:53:23 | <gqplox> | <geekosaur> is how it normally shows |
| 21:53:27 | <gqplox> | ah thanks mauke |
| 21:53:33 | <geekosaur> | that was a /action |
| 21:53:35 | <gqplox> | as you can see im quite a beginner haha |
| 21:53:41 | <geekosaur> | aka /me |
| 21:53:42 | <mauke> | gqplox: /me is kinda having a poor day |
| 21:53:46 | <gqplox> | oh |
| 21:53:50 | gqplox | is tired |
| 21:53:54 | <gqplox> | ah |
| 21:53:55 | <gqplox> | haha nice |
| 21:54:38 | <bobbingbob> | /me is the bestest ever and nobody can dispute it |
| 21:56:17 | <mauke> | > let allX :: (Bounded a, Enum a) => [a]; allX = [minBound .. maxBound in (allX :: [Bool], allX :: [Char]) |
| 21:56:18 | <lambdabot> | <hint>:1:70: error: parse error on input ‘in’ |
| 21:56:49 | → | nate4 joins (~nate@98.45.169.16) |
| 21:56:51 | <mauke> | > let allX :: (Bounded a, Enum a) => [a]; allX = [minBound .. maxBound] in (allX :: [Bool], allX :: [Char]) |
| 21:56:53 | <lambdabot> | ([False,True],"\NUL\SOH\STX\ETX\EOT\ENQ\ACK\a\b\t\n\v\f\r\SO\SI\DLE\DC1\DC2\... |
| 21:58:01 | <gqplox> | geekosaur im confused what this asTypeOf does in the example you gave for allOf |
| 21:58:48 | <mauke> | forces two types to align |
| 21:59:35 | <gqplox> | so what would the two types be here? |
| 21:59:43 | <gqplox> | minBound and x |
| 22:00:01 | <mauke> | minBound :: (Bounded a) => a |
| 22:00:32 | <mauke> | x is the function parameter whose value is unused, but we treat it as a proxy for the type |
| 22:00:55 | <mauke> | because we can't pass types in directly, but we can pass in dummy values of a type |
| 22:01:29 | <mauke> | minBound `asTypeOf` x forces the types to align, so we get the minimum value of the type of x |
| 22:01:39 | × | nate4 quits (~nate@98.45.169.16) (Ping timeout: 260 seconds) |
| 22:01:44 | <gqplox> | hmm ok, so its like doing minBound :: Type |
| 22:01:50 | <mauke> | yeah |
| 22:01:54 | <gqplox> | but because you dont know what to put for the type |
| 22:01:58 | <gqplox> | alright thank you |
| 22:02:14 | <mauke> | the implementation of asTypeOf is funny, too |
| 22:02:29 | <mauke> | asTypeOf :: a -> a -> a; x `asTypeOf` _ = x |
| 22:03:57 | × | stef204 quits (~stef204@user/stef204) (Quit: WeeChat 3.7.1) |
| 22:04:25 | → | merijn joins (~merijn@c-001-001-012.client.esciencecenter.eduvpn.nl) |
| 22:05:27 | <gqplox> | also thanks for the tip about concatMap, it's useful |
| 22:05:30 | → | raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) |
| 22:07:12 | <mauke> | > let showMinOf :: (Bounded a, Show a) => proxy a -> String; showMinOf px = show (minBound `asProxyTypeOf` px) where { asProxyTypeOf :: a -> proxy a -> a; asProxyTypeOf x _ = x } in showMinOf ([] :: [Bool]) |
| 22:07:14 | <lambdabot> | "False" |
| 22:07:34 | × | takuan quits (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection) |
| 22:07:36 | <mauke> | > let showMinOf :: (Bounded a, Show a) => proxy a -> String; showMinOf px = show (minBound `asProxyTypeOf` px) where { asProxyTypeOf :: a -> proxy a -> a; asProxyTypeOf x _ = x } in showMinOf ([] :: [Int]) |
| 22:07:38 | <lambdabot> | "-9223372036854775808" |
| 22:09:15 | × | fockerize quits (~finn@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr) (Ping timeout: 260 seconds) |
| 22:10:18 | × | polo quits (~polo@user/polo) (Quit: resegt) |
| 22:12:10 | × | beteigeuze quits (~Thunderbi@a79-169-109-107.cpe.netcabo.pt) (Remote host closed the connection) |
| 22:12:19 | × | iteratee quits (~kyle@162.218.222.107) (Read error: Connection reset by peer) |
| 22:12:26 | → | iteratee joins (~kyle@162.218.222.107) |
| 22:12:34 | × | noodstudent quits (~AdminUser@137.220.72.94) (Quit: https://quassel-irc.org - Chat comfortably. Anywhere.) |
| 22:12:35 | → | polo joins (~polo@user/polo) |
| 22:13:24 | × | bobbingbob quits (~bobbingbo@2604:3d09:207f:f650::b469) (Quit: Leaving) |
| 22:16:57 | → | beteigeuze joins (~Thunderbi@a79-169-109-107.cpe.netcabo.pt) |
| 22:17:16 | → | eggplantade joins (~Eggplanta@2600:1700:38c5:d800:3cb4:cd70:33e6:e916) |
| 22:22:05 | × | eggplantade quits (~Eggplanta@2600:1700:38c5:d800:3cb4:cd70:33e6:e916) (Ping timeout: 260 seconds) |
| 22:22:58 | → | fockerize joins (~finn@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr) |
| 22:27:14 | × | gmg quits (~user@user/gehmehgeh) (Quit: Leaving) |
| 22:27:44 | × | merijn quits (~merijn@c-001-001-012.client.esciencecenter.eduvpn.nl) (Ping timeout: 268 seconds) |
| 22:29:17 | <EvanR> | has anyone heard of this game Infinite Turtles. I just made a circuit for addition which uses a miniature version of itself in the implementation. I'm finding a lot of solutions end up being the Haskell code in circuit form xD |
| 22:32:23 | × | polo quits (~polo@user/polo) (Quit: resegt) |
| 22:32:37 | → | evanvarvell joins (~evanvarve@097-088-181-216.res.spectrum.com) |
| 22:32:39 | × | chele quits (~chele@user/chele) (Remote host closed the connection) |
| 22:34:05 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 22:34:46 | × | troydm quits (~troydm@host-176-37-124-197.b025.la.net.ua) (Ping timeout: 252 seconds) |
| 22:46:03 | × | bgs quits (~bgs@212-85-160-171.dynamic.telemach.net) (Remote host closed the connection) |
| 22:47:04 | <akegalj> | When I have defined function that does pattern matching with bang patterns like `fun (!a, !b) = something` , is this semantically/operationally the same as `fun (a, b) = a `seq` b `seq` something` ? |
| 22:47:40 | <monochrom> | Yes. |
| 22:47:57 | <akegalj> | monochrom: thanks |
| 22:48:29 | <monochrom> | It might not be clear how this generalizes to more complex examples. But see the GHC User's Guide for the full story. |
| 22:48:53 | <akegalj> | monochrom: ok, will have a look |
| 22:50:03 | → | cowboy8625 joins (~cowboy@96-2-208-2-static.midco.net) |
| 22:50:58 | <cowboy8625> | Hey Hey! |
| 22:52:02 | <cowboy8625> | I have been working on my own functional language lately. Havent gotten very far but it has been fun. |
| 22:52:29 | <cowboy8625> | parseing haskell like syntax is a bit of a challange. |
| 22:52:44 | <cowboy8625> | for me at lest with my tiny brain./ |
| 22:53:07 | × | freeside quits (~mengwong@103.252.202.193) (Ping timeout: 256 seconds) |
| 22:53:38 | <juri_> | cowboy8625: writing languages is fun. handling other people's language decisions is.. more fun. :) |
| 22:54:10 | × | king_gs quits (~Thunderbi@2806:103e:29:bfeb:c988:bbd5:2586:4924) (Ping timeout: 260 seconds) |
| 22:54:53 | <cowboy8625> | what do you mean? |
| 22:55:19 | → | coot joins (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) |
| 22:55:53 | <cowboy8625> | i find the ocaml syntax to be a bit easier to parse. Although I am not useing nether but more ocamls. |
| 22:56:50 | <monochrom> | If you don't implement Haskell's layout-sensitive part, it should be pretty comparable to OCaml. |
| 22:57:26 | <monochrom> | If you want to include the layout part, it needs to be its own stage, sitting between the lexer stage and the CFG stage. |
| 22:58:10 | <monochrom> | (And it converts layout to layout-free {;} thingies so you have a simple CFG again.) |
| 22:59:20 | × | use-value quits (~Thunderbi@2a00:23c6:8a03:2f01:75c2:a71f:beaa:29bf) (Remote host closed the connection) |
| 22:59:39 | → | use-value joins (~Thunderbi@2a00:23c6:8a03:2f01:75c2:a71f:beaa:29bf) |
| 23:01:18 | <cowboy8625> | hmmm that makes a lot of sense..... |
| 23:01:25 | <cowboy8625> | thanks! |
| 23:02:56 | <cowboy8625> | I dont understand why ocaml went with the `;;` for there deliminator. |
| 23:03:08 | × | califax quits (~califax@user/califx) (Remote host closed the connection) |
| 23:03:14 | → | srz joins (~srz@181.228.49.93) |
| 23:03:32 | <cowboy8625> | been struggling with the pratt parser for a long time but I think I figured it out. |
| 23:03:57 | → | califax joins (~califax@user/califx) |
| 23:04:01 | → | freeside joins (~mengwong@103.252.202.193) |
| 23:04:04 | × | michalz quits (~michalz@185.246.207.221) (Remote host closed the connection) |
| 23:04:30 | × | wonko quits (~wjc@2a0e:1c80:2:0:45:15:19:130) (Ping timeout: 240 seconds) |
| 23:05:06 | → | wonko joins (~wjc@2a0e:1c80:2:0:45:15:19:130) |
| 23:06:50 | → | elevenkb joins (~elevenkb@105.184.125.168) |
| 23:09:43 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 23:10:24 | × | beteigeuze quits (~Thunderbi@a79-169-109-107.cpe.netcabo.pt) (Remote host closed the connection) |
| 23:15:41 | <EvanR> | ;; is so you know it's ocaml |
| 23:16:15 | <EvanR> | or more likely "someone picked that first, blame them" |
| 23:16:21 | → | king_gs joins (~Thunderbi@187.201.139.206) |
| 23:16:27 | × | elevenkb quits (~elevenkb@105.184.125.168) (Ping timeout: 268 seconds) |
| 23:16:41 | <hpc> | EvanR: it could still be bash ;) |
| 23:18:18 | <EvanR> | see, told you |
| 23:18:21 | <monochrom> | I think SML or even its predecessor started using ;; |
| 23:21:00 | × | mncheck quits (~mncheck@193.224.205.254) (Ping timeout: 260 seconds) |
| 23:21:12 | → | beteigeuze joins (~Thunderbi@a79-169-109-107.cpe.netcabo.pt) |
| 23:22:13 | → | denl^ joins (~denl@76.145.185.103) |
| 23:25:42 | × | srz quits (~srz@181.228.49.93) (Ping timeout: 268 seconds) |
| 23:27:17 | <EvanR> | when the question is too hard, use recursion |
| 23:27:57 | <juri_> | when recursion is too hard, use violence? |
| 23:28:24 | → | zeenk joins (~zeenk@2a02:2f04:a208:3600::7fe) |
| 23:29:22 | × | beteigeuze quits (~Thunderbi@a79-169-109-107.cpe.netcabo.pt) (Remote host closed the connection) |
| 23:29:42 | <hpc> | when recursion is too hard, use recursion |
| 23:29:49 | <EvanR> | ^ |
| 23:29:54 | <monochrom> | What hpc said. :) |
| 23:34:10 | <cowboy8625> | What are yall working on? |
| 23:35:34 | Guest5270 | is now known as money |
| 23:36:06 | <EvanR> | advent of code 2020 |
| 23:36:08 | <monochrom> | Um, writing a few lines of emacs lisp to tell emacs that for *.dump-* files emacs should auto-reload them whenever they are changed externally (by GHC in my case). |
| 23:36:40 | <monochrom> | *.dump-* files are made by GHC when I request it to spit out intermediate code. |
| 23:37:25 | <monochrom> | You can also white-paper-level-understand it as "writing emacs lisp to help me understand haskell"? >:) |
| 23:37:38 | <monochrom> | or popsci-level-understand |
| 23:41:30 | → | acidjnk_new joins (~acidjnk@p200300d6e7137a332868e30cc8c30a1f.dip0.t-ipconnect.de) |
| 23:41:31 | × | acidjnk quits (~acidjnk@p200300d6e7137a338cbf33f376421589.dip0.t-ipconnect.de) (Ping timeout: 260 seconds) |
| 23:47:30 | → | king_gs1 joins (~Thunderbi@2806:103e:29:bfeb:c988:bbd5:2586:4924) |
| 23:47:31 | × | king_gs quits (~Thunderbi@187.201.139.206) (Read error: Connection reset by peer) |
| 23:47:31 | king_gs1 | is now known as king_gs |
| 23:47:48 | → | elevenkb joins (~elevenkb@105.184.125.168) |
| 23:51:37 | × | mixfix41 quits (~sdenynine@user/mixfix41) (Ping timeout: 268 seconds) |
| 23:51:47 | → | ted[m] joins (~tedmatrix@2001:470:69fc:105::2:bf60) |
| 23:52:44 | → | beteigeuze joins (~Thunderbi@a79-169-109-107.cpe.netcabo.pt) |
| 23:52:50 | × | fockerize quits (~finn@roc37-h01-176-170-197-243.dsl.sta.abo.bbox.fr) (Ping timeout: 268 seconds) |
| 23:53:59 | × | coot quits (~coot@2a02:a310:e241:1b00:ec1a:e9df:79ac:66ba) (Quit: coot) |
| 23:56:10 | × | king_gs quits (~Thunderbi@2806:103e:29:bfeb:c988:bbd5:2586:4924) (Ping timeout: 240 seconds) |
| 23:59:17 | → | king_gs joins (~Thunderbi@187.201.139.206) |
All times are in UTC on 2022-11-17.