Logs on 2024-03-07 (liberachat/#haskell)
| 00:03:37 | → | Sgeo_ joins (~Sgeo@user/sgeo) |
| 00:04:01 | × | Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer) |
| 00:04:05 | → | mastarija joins (~mastarija@141-136-168-205.dsl.iskon.hr) |
| 00:04:49 | × | rvalue quits (~rvalue@user/rvalue) (Ping timeout: 246 seconds) |
| 00:04:53 | × | mastarija quits (~mastarija@141-136-168-205.dsl.iskon.hr) (Client Quit) |
| 00:05:15 | → | mastarija joins (~mastarija@141-136-168-205.dsl.iskon.hr) |
| 00:05:56 | × | ph88 quits (~ph88@2a02:8109:9e26:c800:5ab5:db14:e57d:d013) (Remote host closed the connection) |
| 00:09:16 | × | smalltalkman quits (uid545680@id-545680.hampstead.irccloud.com) (Quit: Connection closed for inactivity) |
| 00:12:22 | → | rvalue joins (~rvalue@user/rvalue) |
| 00:12:49 | × | iteratee quits (~kyle@162.218.222.207) (Read error: Connection reset by peer) |
| 00:12:59 | → | iteratee joins (~kyle@162.218.222.207) |
| 00:13:37 | × | res0nat0r0844909 quits (~Fletch@falcon.whatbox.ca) (Quit: Ping timeout (120 seconds)) |
| 00:13:51 | → | res0nat0r0844909 joins (~Fletch@falcon.whatbox.ca) |
| 00:17:03 | × | alexherbo2 quits (~alexherbo@2a02-8440-3240-b056-3594-8200-bad6-a60a.rev.sfr.net) (Remote host closed the connection) |
| 00:17:48 | × | dostoyevsky2 quits (~sck@user/dostoyevsky2) (Ping timeout: 260 seconds) |
| 00:18:50 | → | tri joins (~tri@ool-18bc2e74.dyn.optonline.net) |
| 00:23:16 | <geekosaur> | I don't know where it's documented, but the support window is the current and previous release |
| 00:23:50 | <geekosaur> | so 9.6 and 9.8 are currently supported (and a new 9.6 release is being prepared, which will probably be its last because 9.10 is on the way) |
| 00:24:05 | <geekosaur> | https://gitlab.haskell.org/ghc/ghc/-/wikis/GHC-status |
| 00:27:14 | <geekosaur> | some packages have wider ghc support windows, for example HLS supports back to ghc 9.2 |
| 00:27:22 | × | mastarija quits (~mastarija@141-136-168-205.dsl.iskon.hr) (Quit: Client closed) |
| 00:32:14 | → | dostoyevsky2 joins (~sck@user/dostoyevsky2) |
| 00:33:11 | × | Feuermagier quits (~Feuermagi@user/feuermagier) (Quit: Leaving) |
| 00:33:17 | × | mei quits (~mei@user/mei) (Remote host closed the connection) |
| 00:35:41 | → | mei joins (~mei@user/mei) |
| 00:39:11 | × | tri quits (~tri@ool-18bc2e74.dyn.optonline.net) (Quit: Leaving...) |
| 00:40:24 | × | inedia quits (~irc@2602:2da:0:80:5054:ff:fe3c:8d93) (Quit: WeeChat 4.1.2) |
| 00:43:21 | <geekosaur> | hm, actually I think it's current and past two, but at this point 9.4 is only going to be updated if a severe bug is found (which seems unlikely this late in its life) |
| 00:54:10 | × | motherfsck quits (~motherfsc@user/motherfsck) (Ping timeout: 246 seconds) |
| 00:57:49 | → | versatile_ joins (~versatile@176.254.244.83) |
| 00:59:17 | → | redmp joins (~redmp@mobile-166-177-251-21.mycingular.net) |
| 01:00:41 | × | versatile quits (~versatile@176.254.244.83) (Ping timeout: 256 seconds) |
| 01:07:22 | → | motherfsck joins (~motherfsc@user/motherfsck) |
| 01:16:07 | × | thegeekinside quits (~thegeekin@189.217.83.221) (Remote host closed the connection) |
| 01:18:02 | → | son0p joins (~ff@186.121.98.6) |
| 01:19:34 | → | EvanR_ joins (~EvanR@user/evanr) |
| 01:20:02 | × | EvanR quits (~EvanR@user/evanr) (Read error: Connection reset by peer) |
| 01:20:22 | <haskellbridge> | <sm> yea I thought last 3 major releases was common |
| 01:20:27 | <haskellbridge> | <sm> but it really depends on your goals |
| 01:20:35 | × | redmp quits (~redmp@mobile-166-177-251-21.mycingular.net) (Ping timeout: 260 seconds) |
| 01:20:52 | <haskellbridge> | <sm> and project |
| 01:23:45 | → | ryanbooker joins (uid4340@id-4340.hampstead.irccloud.com) |
| 01:25:57 | → | peterbecich joins (~Thunderbi@047-229-123-186.res.spectrum.com) |
| 01:37:54 | → | machinedgod joins (~machinedg@d173-183-246-216.abhsia.telus.net) |
| 01:41:39 | → | RahulMalhotra joins (~RahulMalh@2409:4051:4e1b:efb5::848:eb13) |
| 01:42:59 | × | RahulMalhotra quits (~RahulMalh@2409:4051:4e1b:efb5::848:eb13) (Client Quit) |
| 01:47:13 | × | xff0x quits (~xff0x@2405:6580:b080:900:4382:9a13:8c84:8575) (Ping timeout: 264 seconds) |
| 01:48:20 | × | Buggys quits (Buggys@Buggy.shelltalk.net) (Ping timeout: 256 seconds) |
| 01:53:40 | × | szkl quits (uid110435@id-110435.uxbridge.irccloud.com) (Quit: Connection closed for inactivity) |
| 01:53:52 | → | smalltalkman joins (uid545680@id-545680.hampstead.irccloud.com) |
| 01:56:45 | → | Buggys joins (Buggys@shelltalk.net) |
| 02:00:30 | → | Lord_of_Life_ joins (~Lord@user/lord-of-life/x-2819915) |
| 02:01:11 | × | Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 264 seconds) |
| 02:01:55 | Lord_of_Life_ | is now known as Lord_of_Life |
| 02:08:14 | → | inedia joins (~irc@2600:3c00:e000:287::1) |
| 02:22:39 | × | peterbecich quits (~Thunderbi@047-229-123-186.res.spectrum.com) (Ping timeout: 255 seconds) |
| 02:26:58 | × | euleritian quits (~euleritia@77.22.252.56) (Ping timeout: 264 seconds) |
| 02:31:42 | → | euleritian joins (~euleritia@dynamic-176-006-179-235.176.6.pool.telefonica.de) |
| 02:33:11 | → | igemnace joins (~ian@user/igemnace) |
| 02:34:17 | → | Feuermagier joins (~Feuermagi@user/feuermagier) |
| 02:34:41 | → | xff0x joins (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) |
| 02:35:55 | → | vnogueira joins (~vnogueira@user/vnogueira) |
| 02:42:41 | × | mulk quits (~mulk@p5b1123d6.dip0.t-ipconnect.de) (Ping timeout: 256 seconds) |
| 02:43:44 | → | mulk joins (~mulk@p5b112b94.dip0.t-ipconnect.de) |
| 02:47:13 | × | otto_s quits (~user@p4ff2730f.dip0.t-ipconnect.de) (Ping timeout: 256 seconds) |
| 02:49:04 | → | otto_s joins (~user@p4ff27fa9.dip0.t-ipconnect.de) |
| 02:52:27 | → | Square2 joins (~Square4@user/square) |
| 02:55:30 | × | Square quits (~Square@user/square) (Ping timeout: 255 seconds) |
| 02:57:34 | × | machinedgod quits (~machinedg@d173-183-246-216.abhsia.telus.net) (Ping timeout: 264 seconds) |
| 03:00:46 | × | Feuermagier quits (~Feuermagi@user/feuermagier) (Remote host closed the connection) |
| 03:05:30 | → | tri joins (~tri@ool-18bc2e74.dyn.optonline.net) |
| 03:08:23 | × | tri quits (~tri@ool-18bc2e74.dyn.optonline.net) (Remote host closed the connection) |
| 03:08:58 | → | tri joins (~tri@ool-18bc2e74.dyn.optonline.net) |
| 03:11:37 | × | jargon quits (~jargon@154.sub-174-205-226.myvzw.com) (Remote host closed the connection) |
| 03:15:25 | × | tri quits (~tri@ool-18bc2e74.dyn.optonline.net) (Ping timeout: 264 seconds) |
| 03:27:51 | × | igemnace quits (~ian@user/igemnace) (Read error: Connection reset by peer) |
| 03:29:47 | → | tri joins (~tri@ool-18bc2e74.dyn.optonline.net) |
| 03:30:08 | → | Square3 joins (~Square4@user/square) |
| 03:30:19 | × | Square2 quits (~Square4@user/square) (Ping timeout: 260 seconds) |
| 03:45:07 | → | igemnace joins (~ian@user/igemnace) |
| 03:48:13 | → | bilegeek joins (~bilegeek@2600:1008:b0a1:15d8:bc27:900c:1b6c:2bce) |
| 03:48:19 | <jackdk> | Can anyone recommend me an FRP library for textmode UIs? I'm most familiar with Reflex's Event/Behavior/Dynamic model but I'd be down to try others (I see `bricki-reflex` was last touched seven years ago) |
| 03:54:46 | <haskellbridge> | <sm> that'd be the one I expect |
| 03:56:03 | <haskellbridge> | <sm> oh, maybe I'm thinking of https://hackage.haskell.org/package/reflex-vty |
| 03:57:35 | × | tri quits (~tri@ool-18bc2e74.dyn.optonline.net) (Remote host closed the connection) |
| 04:00:02 | → | tri joins (~tri@ool-18bc2e74.dyn.optonline.net) |
| 04:01:28 | <geekosaur> | that's what I'd expect it to be anyway; brick is a traditional GUI over vty, I'd expect FRP to also be built atop vty |
| 04:01:39 | <geekosaur> | s/GUI/TUI/ |
| 04:02:06 | <jackdk> | somehow I missed that reflex-vty existed. Thanks both |
| 04:02:16 | × | td_ quits (~td@i53870914.versanet.de) (Ping timeout: 260 seconds) |
| 04:03:52 | → | td_ joins (~td@i53870916.versanet.de) |
| 04:25:08 | × | bontaq`` quits (~user@ool-45779c03.dyn.optonline.net) (Ping timeout: 260 seconds) |
| 04:26:36 | → | aforemny_ joins (~aforemny@i59F516F6.versanet.de) |
| 04:28:01 | × | aforemny quits (~aforemny@i59F516E5.versanet.de) (Ping timeout: 264 seconds) |
| 04:29:20 | → | fansly joins (~fansly@2001:448a:2010:476e:9117:3da:8e3c:52b0) |
| 04:30:00 | → | JamesMowery joins (~JamesMowe@ip98-171-80-211.ph.ph.cox.net) |
| 04:42:29 | × | waleee quits (~waleee@h-176-10-144-38.NA.cust.bahnhof.se) (Ping timeout: 240 seconds) |
| 04:43:58 | × | euleritian quits (~euleritia@dynamic-176-006-179-235.176.6.pool.telefonica.de) (Read error: Connection reset by peer) |
| 04:44:16 | → | euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
| 04:48:29 | → | bitdex joins (~bitdex@gateway/tor-sasl/bitdex) |
| 04:55:18 | → | redmp joins (~redmp@mobile-166-171-248-7.mycingular.net) |
| 05:03:24 | → | _ht joins (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) |
| 05:05:57 | × | fansly quits (~fansly@2001:448a:2010:476e:9117:3da:8e3c:52b0) (Quit: Quit) |
| 05:07:28 | → | fansly joins (~fansly@2001:448a:2010:476e:9117:3da:8e3c:52b0) |
| 05:07:41 | × | fansly quits (~fansly@2001:448a:2010:476e:9117:3da:8e3c:52b0) (Remote host closed the connection) |
| 05:07:43 | → | peterbecich joins (~Thunderbi@047-229-123-186.res.spectrum.com) |
| 05:07:58 | → | michalz joins (~michalz@185.246.207.205) |
| 05:08:47 | × | ryanbooker quits (uid4340@id-4340.hampstead.irccloud.com) (Quit: Connection closed for inactivity) |
| 05:11:52 | × | tri quits (~tri@ool-18bc2e74.dyn.optonline.net) (Remote host closed the connection) |
| 05:14:57 | → | tri joins (~tri@ool-18bc2e74.dyn.optonline.net) |
| 05:27:52 | × | michalz quits (~michalz@185.246.207.205) (Quit: ZNC 1.8.2 - https://znc.in) |
| 05:30:38 | → | michalz joins (~michalz@185.246.207.200) |
| 05:30:48 | edwardk | wakes up and checks in on how things are going around here. |
| 05:35:56 | → | jargon joins (~jargon@154.sub-174-205-226.myvzw.com) |
| 05:36:57 | → | fansly joins (~fansly@2001:448a:2010:476e:9117:3da:8e3c:52b0) |
| 05:39:45 | × | qqq quits (~qqq@92.43.167.61) (Remote host closed the connection) |
| 05:41:18 | × | fansly quits (~fansly@2001:448a:2010:476e:9117:3da:8e3c:52b0) (Client Quit) |
| 05:43:53 | × | jargon quits (~jargon@154.sub-174-205-226.myvzw.com) (Remote host closed the connection) |
| 05:47:23 | × | euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 264 seconds) |
| 05:47:57 | → | euleritian joins (~euleritia@dynamic-176-006-179-235.176.6.pool.telefonica.de) |
| 05:48:17 | × | euleritian quits (~euleritia@dynamic-176-006-179-235.176.6.pool.telefonica.de) (Read error: Connection reset by peer) |
| 05:49:40 | → | euleritian joins (~euleritia@dynamic-176-006-179-235.176.6.pool.telefonica.de) |
| 05:55:49 | × | mei quits (~mei@user/mei) (Remote host closed the connection) |
| 05:58:13 | → | mei joins (~mei@user/mei) |
| 06:02:55 | × | mjrosenb quits (~mjrosenb@pool-96-232-177-77.nycmny.fios.verizon.net) (Ping timeout: 260 seconds) |
| 06:09:44 | × | euleritian quits (~euleritia@dynamic-176-006-179-235.176.6.pool.telefonica.de) (Read error: Connection reset by peer) |
| 06:10:18 | → | euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
| 06:10:23 | × | peterbecich quits (~Thunderbi@047-229-123-186.res.spectrum.com) (Ping timeout: 260 seconds) |
| 06:12:16 | × | tri quits (~tri@ool-18bc2e74.dyn.optonline.net) (Remote host closed the connection) |
| 06:16:53 | × | redmp quits (~redmp@mobile-166-171-248-7.mycingular.net) (Ping timeout: 256 seconds) |
| 06:18:25 | → | takuan joins (~takuan@178-116-218-225.access.telenet.be) |
| 06:23:10 | × | euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 246 seconds) |
| 06:23:36 | → | euleritian joins (~euleritia@dynamic-176-006-179-235.176.6.pool.telefonica.de) |
| 06:23:40 | → | danza joins (~francesco@151.43.168.41) |
| 06:24:02 | → | Lycurgus joins (~georg@user/Lycurgus) |
| 06:24:33 | → | mjrosenb joins (~mjrosenb@pool-96-232-177-77.nycmny.fios.verizon.net) |
| 06:25:35 | × | ec quits (~ec@gateway/tor-sasl/ec) (Remote host closed the connection) |
| 06:26:14 | → | ec joins (~ec@gateway/tor-sasl/ec) |
| 06:29:36 | → | raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) |
| 06:34:15 | → | tri joins (~tri@ool-18bc2e74.dyn.optonline.net) |
| 06:36:59 | <haskellbridge> | <sm> good morning edwardk ☀️ |
| 06:37:13 | × | _ht quits (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Remote host closed the connection) |
| 06:54:27 | × | tri quits (~tri@ool-18bc2e74.dyn.optonline.net) (Remote host closed the connection) |
| 06:55:58 | → | sord937 joins (~sord937@gateway/tor-sasl/sord937) |
| 06:56:13 | × | petrichor quits (~znc-user@user/petrichor) (Ping timeout: 264 seconds) |
| 06:57:15 | → | tri joins (~tri@ool-18bc2e74.dyn.optonline.net) |
| 06:57:57 | × | echoreply quits (~echoreply@45.32.163.16) (Quit: WeeChat 2.8) |
| 06:58:35 | → | acidjnk_new3 joins (~acidjnk@p200300d6e737e753f8b7044289a8517e.dip0.t-ipconnect.de) |
| 06:59:17 | → | echoreply joins (~echoreply@45.32.163.16) |
| 07:06:12 | × | gabiruh quits (~gabiruh@vps19177.publiccloud.com.br) (Quit: ZNC 1.7.5 - https://znc.in) |
| 07:19:04 | × | tri quits (~tri@ool-18bc2e74.dyn.optonline.net) (Remote host closed the connection) |
| 07:20:49 | × | ski quits (~ski@ext-1-033.eduroam.chalmers.se) (Ping timeout: 264 seconds) |
| 07:23:48 | → | fmd joins (~fmd@user/framend) |
| 07:25:44 | × | danza quits (~francesco@151.43.168.41) (Ping timeout: 260 seconds) |
| 07:26:42 | → | gabiruh joins (~gabiruh@vps19177.publiccloud.com.br) |
| 07:27:06 | → | zetef joins (~quassel@95.77.17.251) |
| 07:27:50 | × | mei quits (~mei@user/mei) (Remote host closed the connection) |
| 07:30:15 | → | mei joins (~mei@user/mei) |
| 07:33:14 | → | tr_ev joins (~trev@user/trev) |
| 07:36:56 | × | raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 260 seconds) |
| 07:38:39 | × | phma quits (~phma@2001:5b0:212a:dbd8:9225:61ca:7b7d:b499) (Read error: Connection reset by peer) |
| 07:39:23 | → | phma joins (phma@2001:5b0:211f:bff8:ed6a:61e2:ef0c:3875) |
| 07:42:44 | → | julie_pilgrim joins (~julie_pil@user/julie-pilgrim/x-1240752) |
| 07:42:47 | → | lortabac joins (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) |
| 07:45:34 | → | raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) |
| 07:46:59 | → | CiaoSen joins (~Jura@2a05:5800:2ad:4600:e6b9:7aff:fe80:3d03) |
| 07:50:18 | × | Sgeo_ quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer) |
| 07:53:46 | × | euleritian quits (~euleritia@dynamic-176-006-179-235.176.6.pool.telefonica.de) (Read error: Connection reset by peer) |
| 07:54:04 | → | euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
| 07:57:14 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 08:00:03 | → | oo_miguel joins (~Thunderbi@78-11-181-16.static.ip.netia.com.pl) |
| 08:06:27 | × | zetef quits (~quassel@95.77.17.251) (Ping timeout: 255 seconds) |
| 08:06:40 | → | misterfish joins (~misterfis@46.44.172.198) |
| 08:12:46 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 260 seconds) |
| 08:12:52 | → | chele joins (~chele@user/chele) |
| 08:15:50 | → | zetef joins (~quassel@95.77.17.251) |
| 08:22:38 | → | danse-nr3 joins (~danse@185.211.81.183) |
| 08:25:29 | × | dcoutts quits (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Ping timeout: 272 seconds) |
| 08:34:41 | × | tzh quits (~tzh@c-73-164-206-160.hsd1.or.comcast.net) (Quit: zzz) |
| 08:40:46 | × | vnogueira quits (~vnogueira@user/vnogueira) (Ping timeout: 260 seconds) |
| 08:41:16 | × | mei quits (~mei@user/mei) (Remote host closed the connection) |
| 08:41:58 | → | vnogueira joins (~vnogueira@user/vnogueira) |
| 08:41:58 | → | machinedgod joins (~machinedg@d173-183-246-216.abhsia.telus.net) |
| 08:43:42 | → | mei joins (~mei@user/mei) |
| 08:50:59 | <absence> | Is it possible to convert from "forall m. C m => a -> m b" to "a -> forall m. C m => m b"? It's kind of like flip, but... :P |
| 08:54:24 | × | trev quits (~trev@user/trev) (Remote host closed the connection) |
| 08:54:40 | → | trev joins (~trev@user/trev) |
| 08:55:29 | <tomsmeding> | absence: https://play.haskell.org/saved/BILj1Fqs seems like ghc just... does it? |
| 08:55:43 | <tomsmeding> | I guess the answer is "eta-expand" |
| 08:56:55 | × | tr_ev quits (~trev@user/trev) (Quit: tr_ev) |
| 08:57:35 | × | notzmv quits (~daniel@user/notzmv) (Remote host closed the connection) |
| 08:58:21 | <danse-nr3> | does not look like flip though, i think the semantic is different (also probably needs parenthesis on the right) |
| 08:59:44 | <probie> | you don't even need to eta-expand in older versions of GHC |
| 09:00:27 | → | notzmv joins (~daniel@user/notzmv) |
| 09:02:18 | <danse-nr3> | oh had to check tomsmeding's snippet |
| 09:02:30 | → | Unicorn_Princess joins (~Unicorn_P@user/Unicorn-Princess/x-3540542) |
| 09:02:42 | <ncf> | it is a kind of dependent flip |
| 09:02:51 | <tomsmeding> | in Core it's a flip |
| 09:02:52 | <absence> | tomsmeding: How about when you fmap such a function? |
| 09:03:08 | <tomsmeding> | absence: add abundant type signatures, then see how many you can remove |
| 09:03:38 | <tomsmeding> | when working with explicitly polymorphic functions, you need lots of type signatures |
| 09:04:46 | × | julie_pilgrim quits (~julie_pil@user/julie-pilgrim/x-1240752) (Remote host closed the connection) |
| 09:05:17 | → | julie_pilgrim joins (~julie_pil@user/julie-pilgrim/x-1240752) |
| 09:05:35 | → | bilegeek_ joins (~bilegeek@2600:1008:b0a1:15d8:bc27:900c:1b6c:2bce) |
| 09:05:41 | × | econo_ quits (uid147250@id-147250.tinside.irccloud.com) (Quit: Connection closed for inactivity) |
| 09:07:58 | → | jau joins (~user@2a04:4540:7212:6d00:e5f3:df01:adee:2cc8) |
| 09:08:09 | <absence> | tomsmeding: https://play.haskell.org/saved/YxvpfR3U |
| 09:08:16 | × | bilegeek quits (~bilegeek@2600:1008:b0a1:15d8:bc27:900c:1b6c:2bce) (Ping timeout: 268 seconds) |
| 09:09:50 | <probie> | absence: https://play.haskell.org/saved/LZ1rvzya |
| 09:09:54 | <tomsmeding> | absence: https://play.haskell.org/saved/Ve1BBcxh |
| 09:09:56 | <tomsmeding> | oh |
| 09:10:01 | <tomsmeding> | lol |
| 09:10:06 | <tomsmeding> | take probie's version |
| 09:10:24 | → | ania123 joins (~ania123@94-43-231-47.dsl.utg.ge) |
| 09:10:25 | → | travgm__ joins (~travgm@2600:100e:a121:ef84:212e:f7c5:fded:46ea) |
| 09:11:54 | <absence> | Ahh of course, lambdas can be eta expanded as well. Thanks! |
| 09:12:36 | × | bilegeek_ quits (~bilegeek@2600:1008:b0a1:15d8:bc27:900c:1b6c:2bce) (Ping timeout: 256 seconds) |
| 09:13:07 | × | travgm_ quits (~travgm@2600:100e:a121:ef84:212e:f7c5:fded:46ea) (Ping timeout: 256 seconds) |
| 09:14:15 | × | misterfish quits (~misterfis@46.44.172.198) (Ping timeout: 256 seconds) |
| 09:15:43 | × | fmd quits (~fmd@user/framend) (Quit: So much programs to build…) |
| 09:25:07 | → | ubert joins (~Thunderbi@2a02:8109:ab8a:5a00:e52f:c589:18bb:7d17) |
| 09:30:02 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 09:31:57 | × | ft quits (~ft@p508db2e6.dip0.t-ipconnect.de) (Quit: leaving) |
| 09:35:32 | × | notzmv quits (~daniel@user/notzmv) (Read error: Connection reset by peer) |
| 09:36:53 | → | misterfish joins (~misterfis@84.53.85.146) |
| 09:39:36 | → | notzmv joins (~daniel@user/notzmv) |
| 09:41:33 | → | kuribas joins (~user@ip-188-118-57-242.reverse.destiny.be) |
| 09:41:41 | × | danse-nr3 quits (~danse@185.211.81.183) (Ping timeout: 252 seconds) |
| 09:42:15 | × | zetef quits (~quassel@95.77.17.251) (Quit: No Ping reply in 180 seconds.) |
| 09:47:52 | → | danse-nr3 joins (~danse@151.43.166.155) |
| 09:50:58 | → | dcoutts joins (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) |
| 09:52:21 | → | szkl joins (uid110435@id-110435.uxbridge.irccloud.com) |
| 09:52:30 | × | danse-nr3 quits (~danse@151.43.166.155) (Read error: Connection reset by peer) |
| 09:53:37 | × | adanwan quits (~adanwan@gateway/tor-sasl/adanwan) (Quit: _) |
| 09:53:47 | → | danse-nr3 joins (~danse@151.43.211.246) |
| 09:53:51 | → | adanwan joins (~adanwan@gateway/tor-sasl/adanwan) |
| 09:56:27 | × | monochrom quits (trebla@216.138.220.146) (Quit: ZNC 1.8.2+deb3.1 - https://znc.in) |
| 10:05:48 | → | zetef joins (~quassel@93.122.251.174) |
| 10:06:11 | × | xff0x quits (~xff0x@125x103x176x34.ap125.ftth.ucom.ne.jp) (Ping timeout: 272 seconds) |
| 10:08:54 | → | monochrom joins (trebla@216.138.220.146) |
| 10:15:22 | × | julie_pilgrim quits (~julie_pil@user/julie-pilgrim/x-1240752) (Remote host closed the connection) |
| 10:15:42 | → | julie_pilgrim joins (~julie_pil@user/julie-pilgrim/x-1240752) |
| 10:16:03 | → | cfricke joins (~cfricke@user/cfricke) |
| 10:26:16 | × | lortabac quits (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) (Ping timeout: 256 seconds) |
| 10:28:53 | × | julie_pilgrim quits (~julie_pil@user/julie-pilgrim/x-1240752) (Remote host closed the connection) |
| 10:32:35 | × | zetef quits (~quassel@93.122.251.174) (Read error: Connection reset by peer) |
| 10:32:52 | × | destituion quits (~destituio@2a02:2121:34a:61a6:afbf:6cfe:62a6:9770) (Ping timeout: 260 seconds) |
| 10:36:54 | → | zetef joins (~quassel@95.77.17.251) |
| 10:40:47 | → | lortabac joins (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) |
| 10:45:30 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 10:50:55 | × | Square3 quits (~Square4@user/square) (Ping timeout: 246 seconds) |
| 10:56:19 | → | [[PSYCHIATRIST joins (~PSYCHIAT@46.197.13.174) |
| 11:02:09 | → | ski joins (~ski@ext-1-033.eduroam.chalmers.se) |
| 11:07:37 | → | xff0x joins (~xff0x@2405:6580:b080:900:e821:772c:646b:bc1f) |
| 11:08:38 | → | causal joins (~eric@50.35.85.7) |
| 11:15:11 | → | __monty__ joins (~toonn@user/toonn) |
| 11:17:59 | × | [[PSYCHIATRIST quits (~PSYCHIAT@46.197.13.174) (Quit: Connection closed) |
| 11:18:48 | → | sidd-dino joins (~sidd-dino@gateway/tor-sasl/sidd-dino) |
| 11:22:13 | × | lortabac quits (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) (Ping timeout: 255 seconds) |
| 11:25:20 | × | igemnace quits (~ian@user/igemnace) (Read error: Connection reset by peer) |
| 11:27:25 | × | Unicorn_Princess quits (~Unicorn_P@user/Unicorn-Princess/x-3540542) (Remote host closed the connection) |
| 11:28:14 | → | a51 joins (a51@gateway/vpn/protonvpn/a51) |
| 11:35:01 | × | euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 246 seconds) |
| 11:35:31 | → | euleritian joins (~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de) |
| 11:36:44 | × | ania123 quits (~ania123@94-43-231-47.dsl.utg.ge) (Quit: Client closed) |
| 11:40:42 | × | euleritian quits (~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de) (Read error: Connection reset by peer) |
| 11:41:06 | → | euleritian joins (~euleritia@77.22.252.56) |
| 11:43:11 | × | danse-nr3 quits (~danse@151.43.211.246) (Ping timeout: 264 seconds) |
| 11:43:17 | → | igemnace joins (~ian@user/igemnace) |
| 11:45:31 | × | euleritian quits (~euleritia@77.22.252.56) (Read error: Connection reset by peer) |
| 11:45:37 | × | ski quits (~ski@ext-1-033.eduroam.chalmers.se) (Ping timeout: 255 seconds) |
| 11:46:05 | → | euleritian joins (~euleritia@77.22.252.56) |
| 11:47:06 | → | ski joins (~ski@ext-1-033.eduroam.chalmers.se) |
| 11:55:14 | × | zetef quits (~quassel@95.77.17.251) (Remote host closed the connection) |
| 11:57:41 | → | lortabac joins (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) |
| 12:05:22 | → | danse-nr3 joins (~danse@151.43.155.172) |
| 12:25:48 | → | gehmehgeh joins (~user@user/gehmehgeh) |
| 12:26:07 | × | CiaoSen quits (~Jura@2a05:5800:2ad:4600:e6b9:7aff:fe80:3d03) (Ping timeout: 246 seconds) |
| 12:26:19 | × | bitdex quits (~bitdex@gateway/tor-sasl/bitdex) (Quit: = "") |
| 12:32:05 | gehmehgeh | is now known as gmg |
| 12:45:46 | × | euleritian quits (~euleritia@77.22.252.56) (Read error: Connection reset by peer) |
| 12:46:36 | → | euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
| 12:58:22 | × | gabiruh quits (~gabiruh@vps19177.publiccloud.com.br) (Quit: ZNC 1.7.5 - https://znc.in) |
| 13:00:15 | × | kuribas quits (~user@ip-188-118-57-242.reverse.destiny.be) (Remote host closed the connection) |
| 13:00:25 | → | kuribas joins (~user@ip-188-118-57-242.reverse.destiny.be) |
| 13:00:39 | × | gmg quits (~user@user/gehmehgeh) (Remote host closed the connection) |
| 13:00:52 | → | gabiruh joins (~gabiruh@vps19177.publiccloud.com.br) |
| 13:01:27 | → | gmg joins (~user@user/gehmehgeh) |
| 13:03:43 | → | srz joins (~srz@181.228.49.93) |
| 13:04:28 | × | gabiruh quits (~gabiruh@vps19177.publiccloud.com.br) (Client Quit) |
| 13:08:34 | → | gabiruh joins (~gabiruh@vps19177.publiccloud.com.br) |
| 13:11:44 | → | tr_ev joins (~trev@user/trev) |
| 13:14:49 | × | euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 264 seconds) |
| 13:17:49 | → | euleritian joins (~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de) |
| 13:19:58 | × | tr_ev quits (~trev@user/trev) (Quit: tr_ev) |
| 13:19:59 | × | euleritian quits (~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de) (Read error: Connection reset by peer) |
| 13:21:43 | → | euleritian joins (~euleritia@77.22.252.56) |
| 13:21:48 | × | L29Ah quits (~L29Ah@wikipedia/L29Ah) (Read error: Connection reset by peer) |
| 13:25:34 | → | CiaoSen joins (~Jura@2a05:5800:2ad:4600:e6b9:7aff:fe80:3d03) |
| 13:26:25 | × | euleritian quits (~euleritia@77.22.252.56) (Ping timeout: 256 seconds) |
| 13:32:12 | → | euleritian joins (~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de) |
| 13:32:35 | × | euleritian quits (~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de) (Read error: Connection reset by peer) |
| 13:33:04 | → | euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
| 13:40:17 | × | notzmv quits (~daniel@user/notzmv) (Read error: Connection reset by peer) |
| 13:40:42 | × | sord937 quits (~sord937@gateway/tor-sasl/sord937) (Remote host closed the connection) |
| 13:41:05 | → | sord937 joins (~sord937@gateway/tor-sasl/sord937) |
| 13:43:41 | → | notzmv joins (~daniel@user/notzmv) |
| 13:46:27 | → | bontaq`` joins (~user@ool-45779c03.dyn.optonline.net) |
| 13:47:13 | × | euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 264 seconds) |
| 13:47:47 | → | bwe joins (~bwe@2a01:4f8:1c1c:4878::2) |
| 13:48:21 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 13:50:05 | × | misterfish quits (~misterfis@84.53.85.146) (Ping timeout: 268 seconds) |
| 13:50:10 | → | euleritian joins (~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de) |
| 13:54:41 | × | danse-nr3 quits (~danse@151.43.155.172) (Ping timeout: 252 seconds) |
| 13:55:28 | → | danse-nr3 joins (~danse@151.43.155.172) |
| 13:55:48 | <bwe> | Hi, how do I collect errors with Applicative and Monad instances using Semigroup? How do I use the Applicative instance correctly? How do I need to define the Monad instance to NOT short-circuit? https://gist.github.com/benjaminweb/fef460aad1e799f415e25389f9c13783 |
| 13:57:44 | → | zetef joins (~quassel@95.77.17.251) |
| 14:04:45 | → | alexherbo2 joins (~alexherbo@2a02-8440-3241-19d1-2046-7c34-1287-cba1.rev.sfr.net) |
| 14:09:39 | <danse-nr3> | hmm why does it have to be applicative? Maybe you want a reader monad where errors get collected |
| 14:10:16 | <[Leary]> | bwe: In the error case for `Monad (Either e)` you have an `e` and an `a -> Either e b`; there's no choice but to stop. You can either restrict yourself to Applicative (see 'validation') or use a Monad that may still produce output even when there are errors (see 'monad-chronicle'). |
| 14:13:42 | <danse-nr3> | huh i meant to write "writer monad" ... and i guess i did not get the context of your question. The chronicle monad looks fun though |
| 14:14:45 | <[Leary]> | Re `sumAll`/`caller`, I think you want `caller = (\a b c -> a + b + c) <$> f1 <*> f2 <*> f3`. |
| 14:26:06 | × | euleritian quits (~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de) (Read error: Connection reset by peer) |
| 14:26:06 | <bwe> | [Leary]: I have functions `f :: a -> b -> c -> Errors [Text] d`. `caller = (\a b c -> f a b c) <$> f1 <*> f2 <*> f3`. |
| 14:26:21 | <bwe> | f1 :: Errors [Text] Int |
| 14:26:23 | → | euleritian joins (~euleritia@77.22.252.56) |
| 14:26:28 | × | danse-nr3 quits (~danse@151.43.155.172) (Ping timeout: 268 seconds) |
| 14:26:45 | <bwe> | f :: a -> b -> c -> Errors [Text] d |
| 14:26:55 | <bwe> | caller :: Errors [Text] Int |
| 14:27:13 | <bwe> | Can I get away with only Applicative? |
| 14:27:50 | <bwe> | [Leary]: calling `f` in the lambda does not compile for me. |
| 14:28:26 | → | danse-nr3 joins (~danse@151.43.155.172) |
| 14:29:50 | → | tri joins (~tri@ool-18bbef1a.static.optonline.net) |
| 14:30:39 | → | fmd joins (~fmd@user/framend) |
| 14:31:55 | × | alexherbo2 quits (~alexherbo@2a02-8440-3241-19d1-2046-7c34-1287-cba1.rev.sfr.net) (Remote host closed the connection) |
| 14:33:16 | → | alexherbo2 joins (~alexherbo@2a02-8440-3241-19d1-6ced-529c-e3c8-d34a.rev.sfr.net) |
| 14:34:12 | <[Leary]> | Nope---you'll end up with `Errors [Text] (Errors [Text] d)`. Collapsing that down to `Errors [Text] d` is precisely what Monad is for. Forgetting about typeclasses for a moment, if what you have on hand is only `Left outerErrs`, the inner errors never even happen, so there's no sense in trying to merge them in. |
| 14:34:47 | × | tri quits (~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 264 seconds) |
| 14:34:58 | → | L29Ah joins (~L29Ah@wikipedia/L29Ah) |
| 14:35:07 | <bwe> | [Leary]: so, it's actually a nice example for bumping into Monad -- I had this feeling yesterday. |
| 14:36:03 | × | marinelli quits (~weechat@gateway/tor-sasl/marinelli) (Quit: marinelli) |
| 14:36:45 | × | alexherbo2 quits (~alexherbo@2a02-8440-3241-19d1-6ced-529c-e3c8-d34a.rev.sfr.net) (Remote host closed the connection) |
| 14:36:48 | → | Unicorn_Princess joins (~Unicorn_P@user/Unicorn-Princess/x-3540542) |
| 14:37:12 | → | tr_ev joins (~trev@user/trev) |
| 14:37:26 | <bwe> | [Leary]: I am not sure whether I've got you right: Can I implement a Monad that does not break execution on encountering first error? |
| 14:37:48 | <bwe> | [Leary]: What do I really want here? |
| 14:37:58 | × | __monty__ quits (~toonn@user/toonn) (Ping timeout: 255 seconds) |
| 14:39:52 | <probie> | bwe: Only if your "monad" can effectively implement `m () -> (a -> m b) -> m b` |
| 14:39:58 | → | __monty__ joins (~toonn@user/toonn) |
| 14:41:06 | <[Leary]> | You can, but not on top of Either. As I said above, see 'monad-chronicle' <https://hackage.haskell.org/package/monad-chronicle> or even just Writer. |
| 14:42:43 | <danse-nr3> | yeah i think the issue here is trying to build on top of Either. I vaguely recall the concept of a "logger monad", but not sure what it has different from a writer |
| 14:43:26 | × | euleritian quits (~euleritia@77.22.252.56) (Ping timeout: 268 seconds) |
| 14:43:29 | <bwe> | [Leary]: so what is https://hackage.haskell.org/package/monad-validate-1.3.0.0/docs/Control-Monad-Validate.html doing, then? |
| 14:43:52 | × | CiaoSen quits (~Jura@2a05:5800:2ad:4600:e6b9:7aff:fe80:3d03) (Quit: CiaoSen) |
| 14:44:22 | <[Leary]> | Something fancier. Ignore it for now. |
| 14:44:44 | <bwe> | [Leary]: https://hackage.haskell.org/package/validation is only Applicative, hence it does not cover the Monad case I need. |
| 14:45:28 | <bwe> | [Leary]: …still trying to grasp what `these` does. |
| 14:45:40 | → | euleritian joins (~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de) |
| 14:45:48 | → | CiaoSen joins (~Jura@2a05:5800:2ad:4600:e6b9:7aff:fe80:3d03) |
| 14:48:01 | × | __monty__ quits (~toonn@user/toonn) (Ping timeout: 272 seconds) |
| 14:50:22 | <bwe> | why do I need either-or-both data type to collect errors? I am fine with not getting the result value if there are any errors AS LONG AS I get all the errors and execution is not short-circuited (except for those functions that need intermediary values that could not be produced). |
| 14:51:01 | × | tr_ev quits (~trev@user/trev) (Quit: tr_ev) |
| 14:51:16 | <bwe> | [Leary]: I've looked into the tests of `these` to get some idea, but I couldn't spot any examples that are simple and explain the usage for me. |
| 14:51:57 | × | cfricke quits (~cfricke@user/cfricke) (Quit: WeeChat 4.1.2) |
| 14:52:38 | <danse-nr3> | these and These seem an unrelated topic |
| 14:52:57 | <bwe> | so, what do I need then? |
| 14:53:10 | <glguy> | You need These so you can collect intermediate errors without short circuiting |
| 14:54:17 | <danse-nr3> | hmm maybe they came in the conversation while i was offline. Makes sense now |
| 14:56:53 | <bwe> | ok, these and monad-chronicle are different animals - which do I want? or better, what's even simpler? is it just a writer monad? |
| 14:59:32 | <bwe> | glguy: and why do I need for not short circuiting either-or-both? I get that the Monad short circuits for `Left e` case. For `Right b` we did not encounter an error at all. |
| 14:59:41 | → | misterfish joins (~misterfis@87.215.131.98) |
| 15:00:20 | <bwe> | So we'd need a thing that holds the error and continues the computation, is that right? |
| 15:01:41 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 15:02:06 | <danse-nr3> | well i guess there would be recoverable errors (These a b) and not-recoverable ones (This a). Probably chronicle abstracts over a writer you could roll by yourself |
| 15:02:26 | → | tri joins (~tri@ool-18bbef1a.static.optonline.net) |
| 15:03:45 | → | jau_ joins (~user@134.101.168.5.dynamic-pppoe.dt.ipv4.wtnet.de) |
| 15:06:12 | × | jau quits (~user@2a04:4540:7212:6d00:e5f3:df01:adee:2cc8) (Ping timeout: 256 seconds) |
| 15:06:46 | × | tri quits (~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 256 seconds) |
| 15:08:43 | <glguy> | bwe: like your said, Left short circuits. Left also carries errors. If you want error and not short circuit you need Both |
| 15:09:33 | <glguy> | I'm the case of Both the result is probably incomplete or wrong (when you're using it for error tracking like this) but that's up to how you've structured your program |
| 15:10:56 | <danse-nr3> | was not familiar with Both. Seems equivalent to These |
| 15:11:57 | <danse-nr3> | although probably better named :P |
| 15:12:35 | <glguy> | I don't remember the name |
| 15:13:08 | <glguy> | Oh, it's These not Both |
| 15:13:25 | <glguy> | But anyway, the thing that was both types |
| 15:13:58 | × | lortabac quits (~lortabac@2a01:e0a:541:b8f0:55ab:e185:7f81:54a4) (Quit: WeeChat 4.1.1) |
| 15:18:43 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 15:18:53 | <haskellbridge> | <eldritchcookie> hello what is preferred a quantified constraint or a new method ? |
| 15:19:24 | <haskellbridge> | <eldritchcookie> compdata has a HFunctor type |
| 15:19:43 | <haskellbridge> | <eldritchcookie> *type class |
| 15:21:28 | <haskellbridge> | <eldritchcookie> and it seems to me that by the definition it should have a quantified constraint forall f. Functor f => Functor (hf f) |
| 15:26:58 | <bwe> | glguy: Alright, if `These a b` collects errors, it can't produce `b` result value. So, what happens then? Will it be swapped to `This a` once an unrecoverable error occurs, i.e. no further computation can be done, hence `b` can't be produced. |
| 15:31:00 | <glguy> | Yeah, swap to the no result only error case and short circuit |
| 15:35:04 | × | ski quits (~ski@ext-1-033.eduroam.chalmers.se) (Remote host closed the connection) |
| 15:35:12 | → | ski joins (~ski@ext-1-033.eduroam.chalmers.se) |
| 15:45:00 | × | puke quits (~puke@user/puke) (Remote host closed the connection) |
| 15:45:23 | → | puke joins (~puke@user/puke) |
| 15:47:22 | × | raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 246 seconds) |
| 15:49:06 | × | ski quits (~ski@ext-1-033.eduroam.chalmers.se) (Ping timeout: 268 seconds) |
| 15:49:20 | → | ski joins (~ski@ext-1-033.eduroam.chalmers.se) |
| 15:55:22 | × | euleritian quits (~euleritia@dynamic-176-006-203-227.176.6.pool.telefonica.de) (Read error: Connection reset by peer) |
| 15:55:41 | → | euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
| 15:58:26 | × | ski quits (~ski@ext-1-033.eduroam.chalmers.se) (Ping timeout: 252 seconds) |
| 15:59:35 | × | euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Read error: Connection reset by peer) |
| 15:59:47 | → | euleritian joins (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) |
| 16:00:34 | × | misterfish quits (~misterfis@87.215.131.98) (Ping timeout: 264 seconds) |
| 16:00:40 | → | ski joins (~ski@ext-1-033.eduroam.chalmers.se) |
| 16:01:27 | × | euphores quits (~SASL_euph@user/euphores) (Quit: Leaving.) |
| 16:03:41 | × | srz quits (~srz@181.228.49.93) (Ping timeout: 240 seconds) |
| 16:04:05 | × | euleritian quits (~euleritia@ip4d16fc38.dynamic.kabel-deutschland.de) (Ping timeout: 240 seconds) |
| 16:05:37 | × | danse-nr3 quits (~danse@151.43.155.172) (Read error: Connection reset by peer) |
| 16:05:58 | → | danse-nr3 joins (~danse@151.43.217.59) |
| 16:08:23 | × | ski quits (~ski@ext-1-033.eduroam.chalmers.se) (Ping timeout: 264 seconds) |
| 16:08:59 | → | euphores joins (~SASL_euph@user/euphores) |
| 16:11:09 | → | raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) |
| 16:11:13 | × | igemnace quits (~ian@user/igemnace) (Quit: WeeChat 4.2.1) |
| 16:12:31 | EvanR_ | is now known as EvanR |
| 16:13:23 | <bwe> | glguy: That's a great start :). My first approach: https://gist.github.com/benjaminweb/0df0b7af1fef73caf47e5006b99a3a07 . If `f0` gives an error, it can't give a `These a b` value, because there is no `b`. However this `This` leads to short circuit `caller2`. I know I need to have `These a b` instead to not short circuit - but how if I don't have value `b`? |
| 16:18:28 | <danse-nr3> | then it is a not-recoverable error, i guess |
| 16:19:19 | <glguy> | bwe: You'll need to restructure your program so that it doesn't immediately depend on an unrecoverable error f0 |
| 16:19:51 | <glguy> | if you have: do x <- f0; ..., then the whole ... depends on there being some x value |
| 16:20:06 | <glguy> | If you're saying the whole thing depends on the result and you do'nt have one, then certainly that's when things stop |
| 16:21:50 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 260 seconds) |
| 16:22:34 | × | causal quits (~eric@50.35.85.7) (Quit: WeeChat 4.1.1) |
| 16:22:37 | × | arahael quits (~arahael@119-18-0-146.771200.syd.nbn.aussiebb.net) (Ping timeout: 264 seconds) |
| 16:23:28 | <dminuoso> | bwe: So what I might want, is rather than shoehorning it into some monadic type like These, I would have some ambient `Env` data type with say `data Env = Env { warnings :: IORef [Warning], errors :: IORef [Error] }`, and then instead of using a singular >>, I would then develop a toolset of combinators that maybe shortcircuit or not, or maybe set errors (that at some later stage become fatal) |
| 16:23:29 | <dminuoso> | while producing some default values (such that you can continue on and collect more errors) |
| 16:23:35 | <glguy> | Two of your choices (maybe there are some more) are to either make up a value and report the error like the restricted sumAll could return the too-big number and record the error about it |
| 16:23:52 | <glguy> | or to not use Monad for piecing together parts that are independent |
| 16:24:01 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 16:24:27 | <glguy> | Switching to using IO won't change the problems you have to solve |
| 16:24:57 | <glguy> | it's just a different mechanism for storing the errors |
| 16:25:52 | <bwe> | Well, I am thinking of just making inputs and outputs same: Errors [Text] Int -> Errors [Text] Int |
| 16:26:04 | <EvanR> | STM can be nice for piecing together parts that are independent |
| 16:26:09 | <EvanR> | STM all the things |
| 16:26:36 | <glguy> | It's not obvious to me how STM helps in this case of validation and error gathering, but it's certainly useful in general |
| 16:26:54 | <EvanR> | didn't read the context sorry |
| 16:27:14 | <dminuoso> | glguy: Oh it can actually simplify things since it gives you sequentiality, possibility of diagnostics - and the question of "errors" (fatal, or fatal at some delayed time) is a matter of simple `IO a -> IO b -> IO b` combinators. |
| 16:27:15 | <glguy> | bwe: you should be able to build what you want not using any typeclasses at all |
| 16:27:28 | <glguy> | dminuoso: No, I don't think it changes the problem in any way |
| 16:27:51 | <dminuoso> | glguy: Well, it does for me *shrugs*. |
| 16:27:54 | <glguy> | You still have to deal with all the same questions |
| 16:28:29 | × | kuribas quits (~user@ip-188-118-57-242.reverse.destiny.be) (Read error: Connection reset by peer) |
| 16:28:50 | <bwe> | Let's simplify: I've got two feeder functions `f1` and `f2`. Both get called before `final` which consumes both. If `f1` and `f2` raise an error, both should be returned. In that case `final` cannot be called. If they don't raise an error, `final` might. |
| 16:29:12 | <glguy> | bwe: try writing what you want directly |
| 16:29:18 | <glguy> | just write some functions that do the thing you want |
| 16:29:23 | <dminuoso> | The point really is, rather than trying to encode special error behavior into a type, its easier to just encode it into a simple `case-of` one way or another. |
| 16:29:40 | <dminuoso> | So I guess we're after the same thing here, glguy. |
| 16:30:05 | <glguy> | once you have it working "manually" you can look to see if the behaviors you desire correspond to any of the premade stuff |
| 16:30:21 | <glguy> | you'll get more clarity about how it should work at all that way |
| 16:31:09 | <glguy> | What you're doing seems "obvious" to me because I've already done it manually before |
| 16:32:33 | <glguy> | after that you'll probably find correspondence between things you've done in your manual code inside things like the Monad instances for the Validate and These types and you'll be more prepared recognize the patterns |
| 16:33:34 | <bwe> | glguy: does that include the case idea by dminuoso? |
| 16:33:45 | <EvanR> | does "parse don't validate" apply |
| 16:34:24 | <glguy> | bwe: If writing out your own cases on the different constructors is dminuoso's idea, then yes |
| 16:34:46 | <dminuoso> | EvanR: So in our SDN compiler we can do both. Its just that that most types here have a UselessDefault instance we can use to make up nonsense values for no purpose other than to carry on to collect further errors. |
| 16:34:55 | <glguy> | EvanR: I think that's the space we're in, but usually that phrase means you shouldn't just check a value is good, you should transform it into a type that only holds good values |
| 16:34:59 | → | ski joins (~ski@ext-1-033.eduroam.chalmers.se) |
| 16:35:10 | <glguy> | EvanR: in this case the topic is that along the way we'd like to provide as much feedback as possible |
| 16:35:16 | <dminuoso> | (And they are special values that are identified in assertion passes, just to make sure we dont accidentally leak them out) |
| 16:35:25 | <glguy> | so don't abort parsing any earlier than you absolutely have ot |
| 16:35:43 | <EvanR> | yeah, find more problems with the input than 1 |
| 16:35:46 | <EvanR> | potentially |
| 16:36:06 | <glguy> | sometimes you find errors that only happened *because* you didn't stop at the first error, but ideally that's the less common case :) |
| 16:36:11 | <dminuoso> | And by module structure, you generally cant accidentally conjure "non-sense values" here other than by `configErrorDef` which automatically sets a fatal error in the compiler environment. |
| 16:36:21 | <dminuoso> | So.. does that satisfy "parse dont validate"? Id say sure. |
| 16:36:50 | <c_wraith> | glguy: it's not less common when using C++! I had GCC report several thousand errors in a hundred line program because of one missing semicolon! |
| 16:36:52 | × | machinedgod quits (~machinedg@d173-183-246-216.abhsia.telus.net) (Ping timeout: 260 seconds) |
| 16:37:47 | <dminuoso> | c_wraith: It's a difficult thing to have parser work with incorrect syntax I supose. |
| 16:38:24 | <dminuoso> | My feeling says there has got to be published research on "recovering" after syntax errors. |
| 16:38:26 | <c_wraith> | dminuoso: also when templates get involved, they can really make your syntax errors happen replicate over and over. |
| 16:39:36 | <c_wraith> | dminuoso: have you use uu-parsinglib? It's an interesting experiment. In the case of parse errors, it reports the error then proceeds as if it had found whatever it was expecting. |
| 16:40:47 | <dminuoso> | Ah another output of Utrecht, it is quite interesting how much research is done in NL. |
| 16:47:36 | <danse-nr3> | supporting science since galileo's times |
| 16:53:27 | <bwe> | glguy, dminuoso: https://gist.github.com/benjaminweb/0df0b7af1fef73caf47e5006b99a3a07#file-mylib-hs-L36-L47 |
| 16:54:05 | <glguy> | bwe: looks like you kind of cheated by moving f0 to the bottom, right? |
| 16:54:36 | <bwe> | glguy: earlier, yes; but ignore caller2 as of now, I've changed caller1 |
| 16:54:55 | <dminuoso> | That all looks rather.. arbitrary. |
| 16:55:18 | <dminuoso> | This looks like an XY problem. |
| 16:55:54 | <dminuoso> | Without seeing the actual problem domain such that `this`, `that`, `f0`, `f1` and `f2` make any sense, its really tough to give any advice how to approach this. |
| 16:56:47 | <bwe> | Let's simplify: I've got two feeder functions `f1` and `f2`. Both get called before `final` which consumes both. If `f1` and `f2` raise an error, both should be returned. In that case `final` cannot be called. If they don't raise an error, `final` might. |
| 16:57:04 | <bwe> | dminuoso: Well, that's my problem statement I've posted earlier. |
| 16:57:27 | → | Tuplanolla joins (~Tuplanoll@91-159-69-59.elisa-laajakaista.fi) |
| 16:57:40 | <dminuoso> | bwe: Write the code exactly like you described it. |
| 16:58:24 | <dminuoso> | Not quite sure what "both should be returend [if f1 and f2 raise an error]" means |
| 16:58:30 | <dminuoso> | both what? |
| 16:58:41 | <probie> | both errors |
| 16:58:49 | <dminuoso> | And if only one returns an error?> |
| 16:58:54 | × | sidd-dino quits (~sidd-dino@gateway/tor-sasl/sidd-dino) (Remote host closed the connection) |
| 16:59:01 | <bwe> | any errors of f1 and f2 should be accumulated and returned |
| 16:59:26 | → | _ht joins (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) |
| 17:00:51 | <dminuoso> | bwe: Yeah, so in my compiler I have these primitives: https://gist.github.com/dminuoso/421ab94f671c010d213592dc09af82daf |
| 17:01:15 | <bwe> | dminuoso: link is dead |
| 17:01:16 | <dminuoso> | Maybe this approach can help you *shrugs* |
| 17:01:21 | <dminuoso> | Sorry https://gist.github.com/dminuoso/421ab94f671c010d213592dc09af82da |
| 17:01:31 | <dminuoso> | Not sure where that trailing f came from |
| 17:02:37 | <bwe> | glguy: is the current implementation of`caller1` the manual way you meant? |
| 17:04:16 | → | destituion joins (~destituio@2a02:2121:650:17b6:2818:3a8c:bceb:d3de) |
| 17:04:31 | <dminuoso> | bwe: Anyway, all of this is only useful if this kind of error handling is a recurring theme for you. |
| 17:04:41 | <dminuoso> | otoh if its a one-off, I wouldnt add a dependency either. |
| 17:05:23 | <EvanR> | halt and catch fire |
| 17:05:27 | <EvanR> | there's your error handling |
| 17:05:35 | <EvanR> | in many trending languages now a days |
| 17:06:13 | <dminuoso> | Ive just become a fan of IO. *shrugs* |
| 17:06:17 | <dminuoso> | It makes so many things so easy. |
| 17:06:22 | <dminuoso> | Collecting state, logging, throwing exceptions... |
| 17:06:45 | <dminuoso> | All the stuff that otherwise introduces large piles of dependency trees, illegible type errors, and unwieldy type signatures. |
| 17:07:12 | <dminuoso> | IO - the forgotten monad. |
| 17:07:22 | <bwe> | What's so hard in accumulating errors? Short circuit only if a function call receives an error value as value. But then return all errors accumulated since. |
| 17:07:33 | <dminuoso> | bwe: Absolutely nothing! I just accumulate them in an IORef! |
| 17:08:10 | <bwe> | I am almost about to escape to write Python! |
| 17:08:58 | <bwe> | dminuoso: why can't this be automatic behaviour in my function using the Monad of that error collecting container? |
| 17:09:41 | <dminuoso> | bwe: what do you mean by "automatic behavior"? |
| 17:09:46 | <dminuoso> | IO *is* that behavior. |
| 17:10:35 | × | ubert quits (~Thunderbi@2a02:8109:ab8a:5a00:e52f:c589:18bb:7d17) (Quit: ubert) |
| 17:10:37 | <bwe> | dminuoso: collect error to error stack on error, short-circuit on error used as argument in function call, then return error stack. |
| 17:10:44 | <bwe> | dminuoso: why do I need IO for this? |
| 17:10:51 | <EvanR> | Writer can also be used to accumulate errors |
| 17:11:23 | <EvanR> | if that's all your code is dedicated to doing |
| 17:11:26 | <bwe> | but I mean, what's the recommended way to do this? |
| 17:12:09 | <EvanR> | when you really know what your code is trying to do, you can use the most appropriate abstraction if it exists, or write a custom type |
| 17:12:17 | <EvanR> | which is how GHC works |
| 17:12:30 | → | redmp joins (~redmp@mobile-166-171-248-17.mycingular.net) |
| 17:12:31 | <EvanR> | if you don't know what your code is trying to do, IO helps |
| 17:12:52 | <EvanR> | but it's a strictly worse situation to be in |
| 17:14:25 | <bwe> | I need a way to not let the computation to short circuit when feeder functions have errors. I need a way to let the computation short circuit once a value is tried to be consumed that is an error value. |
| 17:14:38 | <bwe> | EvanR: does Writer solve my need here? |
| 17:14:50 | <EvanR> | no I thought you were just trying to accumulate error messages |
| 17:15:06 | <bwe> | EvanR: so, what do I need? |
| 17:15:14 | → | tzh joins (~tzh@c-73-164-206-160.hsd1.or.comcast.net) |
| 17:15:18 | <EvanR> | short circuiting? That's Maybe or Either |
| 17:15:38 | <bwe> | glguy: I've searched for some time on gh to find some examples using These to no avail. |
| 17:16:19 | <bwe> | EvanR: We've been through that before, Left of either forces Monad to short circuit on each error. I need it NOT to short circuit on error. |
| 17:16:28 | <EvanR> | > liftA2 (+) (Just 2) (Just 2) |
| 17:16:30 | <lambdabot> | Just 4 |
| 17:16:34 | <EvanR> | > liftA2 (+) (Just 2) Nothing |
| 17:16:35 | <lambdabot> | Nothing |
| 17:16:49 | <EvanR> | you want to not short circuit? that's what I thought |
| 17:16:55 | <glguy> | bwe: These has three cases: Short-circuit with error, Don't short-circuit but also error, Don't short-circuit and no error |
| 17:16:56 | ← | L29Ah parts (~L29Ah@wikipedia/L29Ah) () |
| 17:17:20 | <glguy> | bwe: Most people probably don't use the "these" package, they just write this stuff out manually. The these package doesn't offer that much benefit as a dependency |
| 17:17:47 | <bwe> | EvanR: https://gist.github.com/benjaminweb/fef460aad1e799f415e25389f9c13783 https://gist.github.com/benjaminweb/0df0b7af1fef73caf47e5006b99a3a07 |
| 17:17:49 | × | redmp quits (~redmp@mobile-166-171-248-17.mycingular.net) (Ping timeout: 264 seconds) |
| 17:18:37 | <bwe> | glguy: Don't short-circuit but also error -> previous errors collected on the way didn't prevent from calculating result value. |
| 17:19:04 | <EvanR> | so there's no short circuiting anywhere |
| 17:19:10 | <glguy> | yeah, even if that result value is flawed for the reasons listed in theerrors |
| 17:19:22 | → | redmp joins (~redmp@mobile-166-137-178-225.mycingular.net) |
| 17:19:35 | <glguy> | EvanR: I think bwe wants to avoid short-circuiting when possible, but sometimes that's not possible |
| 17:20:01 | <bwe> | glguy: sometimes: a function tries to use a value that couldn't been produced, i.e. is an error value. |
| 17:20:19 | <glguy> | bwe: in that case you want to short-circuit |
| 17:20:30 | <bwe> | glguy: exactly |
| 17:20:45 | <EvanR> | here's another pattern |
| 17:20:50 | <EvanR> | :t partition |
| 17:20:51 | <lambdabot> | (a -> Bool) -> [a] -> ([a], [a]) |
| 17:20:57 | <EvanR> | :t partitionEithers |
| 17:20:58 | <lambdabot> | [Either a b] -> ([a], [b]) |
| 17:21:18 | <EvanR> | if you analyize a list of things into yes values and no errors, you can sort them and use the yes values, and have the errors |
| 17:22:01 | <bwe> | glguy: but what if `c` gets produced before `f` is called (that takes in `a` and `b`) - in that case c has an error? |
| 17:22:27 | <bwe> | glguy: we can result a `These [c] d` -- d being result of f |
| 17:23:23 | × | danse-nr3 quits (~danse@151.43.217.59) (Ping timeout: 264 seconds) |
| 17:23:46 | × | chele quits (~chele@user/chele) (Remote host closed the connection) |
| 17:24:43 | × | manwithluck quits (manwithluc@gateway/vpn/protonvpn/manwithluck) (Ping timeout: 260 seconds) |
| 17:25:09 | <glguy> | I'm lost in the alphabet, I think |
| 17:25:21 | → | manwithluck joins (manwithluc@gateway/vpn/protonvpn/manwithluck) |
| 17:25:42 | <glguy> | But if f is a function, and it *depends* on a previous computation succeeding because it needs that result to be the function argument, then obviously it can only work if there's a function argument |
| 17:25:52 | × | notzmv quits (~daniel@user/notzmv) (Ping timeout: 260 seconds) |
| 17:26:05 | <glguy> | If it could work without one then it shouldn't be a function |
| 17:26:38 | <ncf> | abcdef[you are here]hij |
| 17:30:25 | → | tri joins (~tri@ool-18bbef1a.static.optonline.net) |
| 17:31:37 | → | econo_ joins (uid147250@id-147250.tinside.irccloud.com) |
| 17:34:48 | × | tri quits (~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 255 seconds) |
| 17:35:51 | × | rvalue quits (~rvalue@user/rvalue) (Ping timeout: 272 seconds) |
| 17:39:47 | <bwe> | https://gist.github.com/benjaminweb/9a9664625f2ba30d14fc0a338dc8a601 <- desired behaviour is described with tests and comments. |
| 17:40:00 | <bwe> | (I am persevering…) |
| 17:40:15 | → | notzmv joins (~daniel@user/notzmv) |
| 17:42:29 | <bwe> | What I want is that the Monad handles that for me. |
| 17:43:01 | <glguy> | bwe: these are examples I'm imagining https://gist.github.com/glguy/e048cf88a20b2fad8df1917bcc1538b9 |
| 17:43:09 | <glguy> | When it comes to a Monad helping you, you will need to use two different types |
| 17:43:28 | <glguy> | One is a Monad that short-circuits and another is merely an Applicative that perseveres |
| 17:43:55 | <glguy> | The Monad will never be able to persevere in the face of a fatal error |
| 17:44:13 | → | Square joins (~Square@user/square) |
| 17:44:14 | <glguy> | because >>= has a function that relies on there being an argument to apply the function to |
| 17:44:48 | <glguy> | but an applicative <*> can gather up errors from both of its arguments |
| 17:45:16 | <bwe> | ah. I want applicative behaviour from a monad. that causes the frustration. |
| 17:45:31 | <glguy> | or if you don't want to use two types, don't make your thing a monad but provide a manual, non >>= function that does what >>= for when you wanted that behavior |
| 17:45:41 | → | rvalue joins (~rvalue@user/rvalue) |
| 17:46:24 | <bwe> | glguy: are you getting the idea of what I am trying to accomplish with my last gist? |
| 17:47:07 | <glguy> | bwe: the thing you want on line 18 is too magical for you to get it using Monad |
| 17:47:47 | <glguy> | You made line 18 "need" c by virtue of you putting it below line 17 |
| 17:48:47 | → | L29Ah joins (~L29Ah@wikipedia/L29Ah) |
| 17:49:56 | <haskellbridge> | <eldritchcookie> uh don't you want callCC? |
| 17:50:11 | <bwe> | glguy: Fine. So delete line 17. if 15 (a) is an error, b should still be processed. short circuit only once `f` tries to pull in `a` and `b`.i |
| 17:50:39 | <glguy> | bwe: if you write a <- getA; ... |
| 17:50:48 | <glguy> | then everything after that depends on a |
| 17:51:11 | <glguy> | If you want that not to be true you need to not use a Monad. You could still get do-notation using ApplicativeDo |
| 17:51:33 | <bwe> | glguy: so ApplicativeDo is what I need |
| 17:52:13 | <glguy> | bwe: using applicativedo to do this kind of validation is what I'm using here https://glguy.net/config-demo/ |
| 17:52:38 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 17:53:11 | <bwe> | glguy: does These take care of accumulating the errors on the way using ApplicativeDo? |
| 17:53:24 | <glguy> | bwe: no, because it has a Monad instance |
| 17:53:37 | <glguy> | and an Applicative instance needs to agree with the Monad instance |
| 17:53:42 | <bwe> | glguy: so, I shouldn't use These for my situation, right? |
| 17:54:17 | <glguy> | You shouldn't use These with ApplicativeDo. for that you'd need a different type or just a newtype around These for when you're doing the do-notation parts |
| 17:56:33 | <bwe> | what do I need then to have the errors accumulate? and short circuiting only once the function tries to use a value that is an error value should be default, or? |
| 17:57:10 | → | drdo8 joins (~drdo@bl5-29-74.dsl.telepac.pt) |
| 17:57:50 | <haskellbridge> | <eldritchcookie> uh why are the semantics of MonadThrow wrong for your use case? |
| 17:57:51 | × | drdo quits (~drdo@bl5-29-74.dsl.telepac.pt) (Ping timeout: 260 seconds) |
| 17:57:51 | drdo8 | is now known as drdo |
| 18:01:55 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 18:02:56 | → | tri joins (~tri@ool-18bbef1a.static.optonline.net) |
| 18:03:19 | → | srz joins (~srz@181.228.49.93) |
| 18:03:27 | → | thailigur joins (~thailigur@94.182.126.244) |
| 18:03:39 | <ncf> | your monadic sequencing is expressing that the computation `f a b` might depend on the values of a, b, and c. you can't really detect that `f a b` isn't using c within the Monad interface |
| 18:03:59 | <ncf> | you'd have to somehow parallelise A+B and C |
| 18:05:14 | <dolio> | It doesn't matter that `f a b` doesn't. The overall computation does. |
| 18:06:07 | → | eldritch_cookie joins (~Srain@177.132.38.123) |
| 18:06:40 | <eldritch_cookie> | hello apparently the matrix bridge is broken so i was just screaming into the void... |
| 18:06:53 | × | tri quits (~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 240 seconds) |
| 18:07:03 | <glguy> | eldritch_cookie: your message about MonadThrow came through |
| 18:07:31 | <glguy> | and then an earlier one about callCC, but I don't know what either had to do with bwe's question |
| 18:08:09 | × | zetef quits (~quassel@95.77.17.251) (Ping timeout: 272 seconds) |
| 18:08:59 | <haskellbridge> | <eldritchcookie> ok ??? isn't the problem that he wants shortcircuit evaluation?? |
| 18:09:05 | <haskellbridge> | <geekosaur> your messages appeaed on both sides of the bridge; what did you think went wrong? |
| 18:10:36 | <glguy> | eldritch_cookie: the overall topic is about avoiding short-circuiting when possible |
| 18:10:37 | → | bontaq``` joins (~user@165.1.205.230) |
| 18:11:01 | <haskellbridge> | <eldritchcookie> huh? |
| 18:11:14 | <haskellbridge> | <eldritchcookie> doesn't void $ getC work? |
| 18:11:49 | × | pavonia quits (~user@user/siracusa) (Quit: Bye!) |
| 18:11:54 | <haskellbridge> | <eldritchcookie> i see no reason why you would call getC not use its bound value and not want any side effects? |
| 18:12:14 | × | bontaq`` quits (~user@ool-45779c03.dyn.optonline.net) (Read error: Connection reset by peer) |
| 18:13:56 | <haskellbridge> | <eldritchcookie> geekousaur: i my earlier message was ignored, i then read the text on the top of the screen so i just assumed my message never went through, |
| 18:15:59 | × | bontaq``` quits (~user@165.1.205.230) (Ping timeout: 256 seconds) |
| 18:16:04 | <haskellbridge> | <eldritchcookie> i guess i was having the wrong expectations on discord even if you don't understand why it isn't related to the conversation you still respond |
| 18:19:46 | → | target_i joins (~target_i@user/target-i/x-6023099) |
| 18:21:36 | × | gmg quits (~user@user/gehmehgeh) (Quit: Leaving) |
| 18:21:41 | × | thailigur quits (~thailigur@94.182.126.244) (Quit: Client closed) |
| 18:28:58 | → | waleee joins (~waleee@h-176-10-144-38.NA.cust.bahnhof.se) |
| 18:31:04 | × | euphores quits (~SASL_euph@user/euphores) (Ping timeout: 255 seconds) |
| 18:32:25 | × | CiaoSen quits (~Jura@2a05:5800:2ad:4600:e6b9:7aff:fe80:3d03) (Ping timeout: 256 seconds) |
| 18:37:26 | → | euphores joins (~SASL_euph@user/euphores) |
| 18:50:05 | × | srz quits (~srz@181.228.49.93) (Ping timeout: 240 seconds) |
| 18:50:08 | <dminuoso> | 17:12:52 EvanR │ but it's a strictly worse situation to be in |
| 18:50:39 | <EvanR> | not knowing what you're supposed to be doing, not IO |
| 18:50:39 | <dminuoso> | I somewhat disagree with that. Shoehorning all your effects into the type system just to avoid that general IO type seems more like a religious choice, especially because of all the pain that it often entails. |
| 18:51:02 | <dminuoso> | The effects are either simple and non-composable, or they are composable and very complicated. |
| 18:51:22 | <dminuoso> | Simple and composable effects is not something we have in Haskell. |
| 18:51:42 | <EvanR> | on all the advanced solutions to do stuff in IO it seems a lot of times just IO would be simpler |
| 18:51:55 | <EvanR> | but when IO is not involved I don't know |
| 18:51:56 | <monochrom> | https://www.vex.net/~trebla/haskell/exception.xhtml :) |
| 18:54:02 | <haskellbridge> | <eldritchcookie> dminuoso: i will have to disagree, i find Effectful quite simple, though if you want to escape IO with it you need a lot of boilerplate |
| 18:54:39 | <haskellbridge> | <eldritchcookie> https://hackage.haskell.org/package/effectful |
| 18:56:24 | × | destituion quits (~destituio@2a02:2121:650:17b6:2818:3a8c:bceb:d3de) (Ping timeout: 260 seconds) |
| 18:56:39 | → | srz joins (~srz@181.228.49.93) |
| 18:57:53 | × | srz quits (~srz@181.228.49.93) (Remote host closed the connection) |
| 18:58:29 | <monochrom> | I'm going to go on a hyperbole and say that I find category theory quite simple too. To prove that if I forgot how much maturity I needed before higher abstractions became simple to me, I would end up giving very derailing advice to beginners. |
| 18:59:40 | <monochrom> | (I spent a year on universal algebra before I heard of category theory. So yeah of course the latter looks so obvious under the circumstance.) |
| 19:00:09 | <int-e> | monochrom: "To understand Haskell, you must first understand adjunctions." |
| 19:00:15 | <monochrom> | hahaha |
| 19:00:47 | <int-e> | (which btw never clicked for me) |
| 19:01:06 | → | srz joins (~srz@181.228.49.93) |
| 19:01:21 | → | tri joins (~tri@ool-18bbef1a.static.optonline.net) |
| 19:02:01 | × | srz quits (~srz@181.228.49.93) (Remote host closed the connection) |
| 19:02:47 | <monochrom> | I also spent a year on lattice theory and Galois adjunctions before I heard of category theory. Even then, I avoided learning category's adjunction (because I hadn't needed it for a long time) until recently. |
| 19:03:39 | <monochrom> | (Galois adjunction just means the two categories are just partial orders, so everything is simpler and a few things trivialized.) |
| 19:04:48 | <monochrom> | The paper that finally demanded me to finally learn category's adjunctions seriously is Ralf Hinze's Adjoint Folds And Unfolds. |
| 19:05:30 | <monochrom> | Oh it also uses Yoneda lemma and Kan extensions and ends and coends, so I am going into that rabbit hole these few weeks. |
| 19:05:58 | × | tri quits (~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 264 seconds) |
| 19:06:52 | × | dcoutts quits (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Remote host closed the connection) |
| 19:07:15 | → | dcoutts joins (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) |
| 19:10:50 | → | misterfish joins (~misterfis@84.53.85.146) |
| 19:27:18 | <haskellbridge> | <eldritchcookie> hourglass has 3500 indirect reverse dependencies and not only is it abandoned it doesn't compile on GHC 9.8 |
| 19:27:26 | <haskellbridge> | <eldritchcookie> fun |
| 19:27:40 | × | misterfish quits (~misterfis@84.53.85.146) (Ping timeout: 260 seconds) |
| 19:40:47 | <tomsmeding> | @hackage acme-everything |
| 19:40:47 | <lambdabot> | https://hackage.haskell.org/package/acme-everything |
| 19:41:03 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 19:48:31 | <haskellbridge> | <eldritchcookie> is that supposed to be relevant to my message, i don't think i know how? i am just annoyed that i can't compile hoogle because tls doesn't compile due to a transitive dependency on hourglass |
| 19:49:43 | → | komikat_ joins (~akshitkr@218.185.248.66) |
| 19:50:06 | × | komikat quits (~akshitkr@218.185.248.66) (Read error: Connection reset by peer) |
| 19:57:56 | × | raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 268 seconds) |
| 19:59:45 | → | jmdaemon joins (~jmdaemon@user/jmdaemon) |
| 20:02:35 | → | srz joins (~srz@181.228.49.93) |
| 20:03:52 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 20:04:45 | <int-e> | worksforme(tm) |
| 20:05:23 | × | dcoutts quits (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Ping timeout: 264 seconds) |
| 20:06:10 | <int-e> | (ignoring the fact that filepath-1.5 breaks stuff and it builds an older version instead) |
| 20:06:46 | × | sord937 quits (~sord937@gateway/tor-sasl/sord937) (Quit: sord937) |
| 20:09:05 | → | dsrt^ joins (~cd@c-98-242-74-66.hsd1.ga.comcast.net) |
| 20:16:24 | → | wootehfoot joins (~wootehfoo@user/wootehfoot) |
| 20:16:24 | → | Guest0 joins (~Guest0@129.170.197.184) |
| 20:17:32 | → | raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) |
| 20:20:22 | <Guest0> | I’ve been looking into the trace function for debugging, and I found out that writing some code like this: |
| 20:20:22 | <Guest0> | myfun a b | trace ("foo " ++ show a ++ " " ++ show b) debug = a + b |
| 20:20:23 | <Guest0> | allows me to print a message whenever some variable called debug is set to True. However, I would like to look into why this works on a conceptual level - if anyone knows the general name for the technique being used to make trace a third parameter of sorts (?), that would be really helpful |
| 20:21:08 | <int-e> | that doesn't look right |
| 20:21:45 | <int-e> | the way it's written, the message will be printed, the guard will evaluate to false and the rhs a + b won't be used. |
| 20:21:54 | → | ft joins (~ft@p508db2e6.dip0.t-ipconnect.de) |
| 20:21:55 | <int-e> | if debug = False |
| 20:22:12 | <Guest0> | It's set to true |
| 20:22:38 | <int-e> | well, trace ... True will print ... and then evaluate to True. |
| 20:22:57 | <int-e> | > let x | True = 1 in x |
| 20:22:58 | <lambdabot> | 1 |
| 20:23:24 | <int-e> | so it's like that but with a side effect. |
| 20:24:00 | × | jmdaemon quits (~jmdaemon@user/jmdaemon) (Ping timeout: 255 seconds) |
| 20:25:56 | <Guest0> | I see. So the idea is that if you're pattern matching on a function and the part after the guard evaluates to False, the match for that particular pattern fails |
| 20:26:23 | × | srz quits (~srz@181.228.49.93) (Ping timeout: 264 seconds) |
| 20:26:40 | <geekosaur> | it's not the part after the guard, it's the guard itself |
| 20:27:11 | <int-e> | my preferred style of doing this is https://paste.tomsmeding.com/GR8qsVSH -- that way the debug code is easy to comment out |
| 20:27:11 | <Guest0> | Right |
| 20:27:11 | <geekosaur> | and `Debug.Trace.trace msg a` evaluates to `a`, with a side effect of printing `msg` |
| 20:27:41 | <geekosaur> | so a quick hack to trace evaluation of functions is to prefix a failing guard with a trace attached |
| 20:28:01 | <geekosaur> | since the guard fails, evaluation falls through to the actual function |
| 20:28:33 | <int-e> | (and using tuples and traceShow saves a bunch of `++` and `show` at the expense of a tiny bit of readability) |
| 20:28:45 | <tomsmeding> | eldritchcookie: oh sorry I was missing the context that this is actually something you're running into |
| 20:29:11 | <tomsmeding> | I thought I was replying to a joke with a joke |
| 20:30:32 | <Guest0> | Yeah that definitely looks a lot more clear/readable, thanks for the example |
| 20:30:54 | × | raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 256 seconds) |
| 20:31:40 | × | Guest0 quits (~Guest0@129.170.197.184) (Quit: Client closed) |
| 20:35:31 | × | rncwnd quits (~quassel@2a01:4f8:221:27c6::1) (Ping timeout: 256 seconds) |
| 20:49:14 | × | chiselfuse quits (~chiselfus@user/chiselfuse) (Ping timeout: 260 seconds) |
| 20:50:29 | × | fmd quits (~fmd@user/framend) (Ping timeout: 240 seconds) |
| 20:51:18 | → | chiselfuse joins (~chiselfus@user/chiselfuse) |
| 20:52:00 | → | rncwnd joins (~quassel@2a01:4f8:221:27c6::1) |
| 21:01:14 | × | chiselfuse quits (~chiselfus@user/chiselfuse) (Remote host closed the connection) |
| 21:01:29 | → | zetef joins (~quassel@95.77.17.251) |
| 21:02:10 | → | chiselfuse joins (~chiselfus@user/chiselfuse) |
| 21:04:10 | ← | L29Ah parts (~L29Ah@wikipedia/L29Ah) () |
| 21:06:54 | × | _ht quits (~Thunderbi@28-52-174-82.ftth.glasoperator.nl) (Remote host closed the connection) |
| 21:08:10 | → | zetef_ joins (~quassel@5.2.182.98) |
| 21:08:13 | × | zetef quits (~quassel@95.77.17.251) (Ping timeout: 264 seconds) |
| 21:08:52 | → | alexherbo2 joins (~alexherbo@2a02-8440-3240-c50e-314b-952c-1197-8413.rev.sfr.net) |
| 21:18:48 | → | tri joins (~tri@ool-18bbef1a.static.optonline.net) |
| 21:23:51 | × | tri quits (~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 272 seconds) |
| 21:27:02 | × | alexherbo2 quits (~alexherbo@2a02-8440-3240-c50e-314b-952c-1197-8413.rev.sfr.net) (Remote host closed the connection) |
| 21:31:49 | × | jau_ quits (~user@134.101.168.5.dynamic-pppoe.dt.ipv4.wtnet.de) (Quit: Leaving) |
| 21:32:03 | × | ski quits (~ski@ext-1-033.eduroam.chalmers.se) (Ping timeout: 260 seconds) |
| 21:33:25 | → | ski joins (~ski@ext-1-033.eduroam.chalmers.se) |
| 21:36:08 | × | wootehfoot quits (~wootehfoo@user/wootehfoot) (Read error: Connection reset by peer) |
| 21:38:43 | × | rncwnd quits (~quassel@2a01:4f8:221:27c6::1) (Ping timeout: 255 seconds) |
| 21:39:00 | → | mark` joins (~user@user/mark/x-6044658) |
| 21:39:26 | × | mark` quits (~user@user/mark/x-6044658) (Quit: ERC 5.5.0.29.1 (IRC client for GNU Emacs 29.1)) |
| 21:41:00 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 21:42:01 | × | target_i quits (~target_i@user/target-i/x-6023099) (Quit: leaving) |
| 21:47:41 | → | dcoutts joins (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) |
| 21:48:12 | → | machinedgod joins (~machinedg@d173-183-246-216.abhsia.telus.net) |
| 21:51:06 | × | michalz quits (~michalz@185.246.207.200) (Quit: ZNC 1.8.2 - https://znc.in) |
| 21:54:43 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 21:57:55 | → | rncwnd joins (~quassel@2a01:4f8:221:27c6::1) |
| 22:01:36 | → | noumenon joins (~noumenon@113.51-175-156.customer.lyse.net) |
| 22:02:03 | → | L29Ah joins (~L29Ah@wikipedia/L29Ah) |
| 22:03:24 | → | pavonia joins (~user@user/siracusa) |
| 22:04:21 | → | jargon joins (~jargon@154.sub-174-205-226.myvzw.com) |
| 22:05:18 | × | ChaiTRex quits (~ChaiTRex@user/chaitrex) (Ping timeout: 260 seconds) |
| 22:06:16 | × | Katarushisu1 quits (~Katarushi@finc-20-b2-v4wan-169598-cust1799.vm7.cable.virginm.net) (Quit: Ping timeout (120 seconds)) |
| 22:06:58 | × | phma quits (phma@2001:5b0:211f:bff8:ed6a:61e2:ef0c:3875) (Read error: Connection reset by peer) |
| 22:08:05 | → | phma joins (phma@2001:5b0:2172:bea8:4de3:ce84:5b1f:c1a2) |
| 22:08:52 | → | Katarushisu1 joins (~Katarushi@finc-20-b2-v4wan-169598-cust1799.vm7.cable.virginm.net) |
| 22:15:23 | × | euphores quits (~SASL_euph@user/euphores) (Quit: Leaving.) |
| 22:15:36 | → | ChaiTRex joins (~ChaiTRex@user/chaitrex) |
| 22:16:03 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 22:19:12 | → | tromp joins (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) |
| 22:20:57 | → | srz joins (~srz@181.228.49.93) |
| 22:23:02 | × | ChaiTRex quits (~ChaiTRex@user/chaitrex) (Ping timeout: 260 seconds) |
| 22:25:01 | → | euphores joins (~SASL_euph@user/euphores) |
| 22:25:45 | × | zetef_ quits (~quassel@5.2.182.98) (Remote host closed the connection) |
| 22:25:46 | → | ChaiTRex joins (~ChaiTRex@user/chaitrex) |
| 22:29:24 | → | Square3 joins (~Square4@user/square) |
| 22:31:18 | × | ChaiTRex quits (~ChaiTRex@user/chaitrex) (Remote host closed the connection) |
| 22:31:53 | → | ChaiTRex joins (~ChaiTRex@user/chaitrex) |
| 22:32:16 | × | Square quits (~Square@user/square) (Ping timeout: 255 seconds) |
| 22:32:49 | → | tri joins (~tri@ool-18bbef1a.static.optonline.net) |
| 22:33:25 | × | tromp quits (~textual@92-110-219-57.cable.dynamic.v4.ziggo.nl) (Quit: My iMac has gone to sleep. ZZZzzz…) |
| 22:37:10 | × | tri quits (~tri@ool-18bbef1a.static.optonline.net) (Ping timeout: 264 seconds) |
| 22:43:02 | → | fmd joins (~fmd@2a02-8429-4b52-f901-ef8a-cb4a-81a3-e1f5.rev.sfr.net) |
| 22:45:25 | × | takuan quits (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection) |
| 22:49:13 | → | Sgeo joins (~Sgeo@user/sgeo) |
| 23:05:39 | × | travgm__ quits (~travgm@2600:100e:a121:ef84:212e:f7c5:fded:46ea) (Read error: Connection reset by peer) |
| 23:06:26 | × | stiell_ quits (~stiell@gateway/tor-sasl/stiell) (Ping timeout: 260 seconds) |
| 23:06:54 | → | travgm__ joins (~travgm@2600:100e:a121:ef84:90d:44c5:aa1d:9cd6) |
| 23:07:24 | → | stiell_ joins (~stiell@gateway/tor-sasl/stiell) |
| 23:09:24 | × | dcoutts quits (~duncan@cpc69402-oxfd27-2-0-cust903.4-3.cable.virginm.net) (Ping timeout: 268 seconds) |
| 23:16:05 | × | fmd quits (~fmd@2a02-8429-4b52-f901-ef8a-cb4a-81a3-e1f5.rev.sfr.net) (Ping timeout: 240 seconds) |
| 23:21:06 | <zwro> | Guest0: this a trick i use https://paste.jrvieira.com/1709853617520 |
| 23:24:25 | <zwro> | not exactly what you want, but it's an easy way to print something whenever the function runs, and easy to just comment out |
| 23:26:50 | <geekosaur> | they left several hours ago… |
| 23:27:54 | <zwro> | did they? |
| 23:27:55 | × | tcard quits (~tcard@2400:4051:5801:7500:cf17:befc:ff82:5303) (Remote host closed the connection) |
| 23:27:59 | <int-e> | they did |
| 23:28:02 | → | endojelly joins (~eselber_p@user/endojelly) |
| 23:28:07 | <endojelly> | so, indexed lenses... |
| 23:28:08 | → | tcard joins (~tcard@2400:4051:5801:7500:cf17:befc:ff82:5303) |
| 23:28:19 | <endojelly> | is there an indexed lens/getter to get me *only* the index? |
| 23:28:56 | <ncf> | :t asIndex |
| 23:28:57 | <lambdabot> | (Indexable i p, Contravariant f, Functor f) => p i (f i) -> Indexed i s (f s) |
| 23:29:01 | <endojelly> | Stuff like itraversed<.>itraversed keeps the indices of both levels *and* the value on the last level |
| 23:29:04 | <endojelly> | oh, I'll try that, thanks |
| 23:29:28 | <endojelly> | wow, I looked at everything starting with "i", at "withIndex"... didn't notice "asIndex" |
| 23:30:17 | × | dolio quits (~dolio@130.44.134.54) (Quit: ZNC 1.8.2 - https://znc.in) |
| 23:31:47 | → | dolio joins (~dolio@130.44.134.54) |
| 23:34:31 | <endojelly> | > itoListOf (itraversed<.itraversed.asIndex) $ fromList [(1, fromList [('a', "foo"), ('b', "bar")]), (2, empty), (3, fromList [('c', "BAZ")])] |
| 23:34:33 | <lambdabot> | error: |
| 23:34:33 | <lambdabot> | • Variable not in scope: fromList :: [(a1, f0 a0)] -> t0 (t1 b0) |
| 23:34:33 | <lambdabot> | • Perhaps you meant one of these: |
| 23:34:43 | → | bontaq``` joins (~user@ool-45779c03.dyn.optonline.net) |
| 23:35:18 | <geekosaur> | :t M.fromList |
| 23:35:19 | <lambdabot> | Ord k => [(k, a)] -> M.Map k a |
| 23:35:30 | × | dolio quits (~dolio@130.44.134.54) (Client Quit) |
| 23:35:31 | <endojelly> | > itoListOf (itraversed<.itraversed.asIndex) $ M.fromList [(1, M.fromList [('a', "foo"), ('b', "bar")]), (2, empty), (3, M.fromList [('c', "BAZ")])] |
| 23:35:32 | <lambdabot> | error: |
| 23:35:32 | <lambdabot> | • Could not deduce (Alternative (M.Map Char)) |
| 23:35:32 | <lambdabot> | arising from a use of ‘empty’ |
| 23:35:43 | <endojelly> | > itoListOf (itraversed<.itraversed.asIndex) $ M.fromList [(1, M.fromList [('a', "foo"), ('b', "bar")]), (2, M.empty), (3, M.fromList [('c', "BAZ")])] |
| 23:35:44 | <lambdabot> | [(1,'a'),(1,'b'),(3,'c')] |
| 23:35:48 | <endojelly> | love it, thanks! |
| 23:36:13 | × | srz quits (~srz@181.228.49.93) (Ping timeout: 272 seconds) |
| 23:39:03 | × | mei quits (~mei@user/mei) (Remote host closed the connection) |
| 23:41:19 | → | dolio joins (~dolio@130.44.134.54) |
| 23:41:30 | → | mei joins (~mei@user/mei) |
| 23:44:22 | → | peterbecich joins (~Thunderbi@047-229-123-186.res.spectrum.com) |
| 23:46:07 | → | mhatta joins (~mhatta@www21123ui.sakura.ne.jp) |
| 23:54:39 | × | Unicorn_Princess quits (~Unicorn_P@user/Unicorn-Princess/x-3540542) (Remote host closed the connection) |
| 23:58:01 | × | acidjnk_new3 quits (~acidjnk@p200300d6e737e753f8b7044289a8517e.dip0.t-ipconnect.de) (Ping timeout: 264 seconds) |
All times are in UTC on 2024-03-07.