Logs on 2022-02-19 (liberachat/#haskell)
| 00:02:26 | → | alMalsamo joins (~alMalsamo@gateway/tor-sasl/almalsamo) |
| 00:04:50 | <shapr> | Anyone want to create intro music for the cofree coffee podcast? Preferably in Haskell? |
| 00:10:31 | → | alx741 joins (~alx741@157.100.197.240) |
| 00:13:52 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 00:16:38 | → | Topsi joins (~Tobias@dyndsl-095-033-091-109.ewe-ip-backbone.de) |
| 00:19:18 | → | chenqisu1 joins (~chenqisu1@183.217.200.249) |
| 00:20:57 | → | jackalope joins (~jackalope@50-24-138-131.bcstcmta02.res.dyn.suddenlink.net) |
| 00:21:32 | × | jackalope quits (~jackalope@50-24-138-131.bcstcmta02.res.dyn.suddenlink.net) (Client Quit) |
| 00:21:48 | → | jackalope joins (~jackalope@50-24-138-131.bcstcmta02.res.dyn.suddenlink.net) |
| 00:21:59 | → | Null_A joins (~null_a@2601:645:8700:2290:890f:d3a0:aab0:f3f) |
| 00:24:13 | × | briandaed quits (~root@109.95.142.92.r.toneticgroup.pl) (Ping timeout: 256 seconds) |
| 00:25:02 | × | lbseale quits (~ep1ctetus@user/ep1ctetus) (Ping timeout: 272 seconds) |
| 00:25:11 | → | prolic joins (~prolic@181.122.131.227) |
| 00:26:17 | × | Null_A quits (~null_a@2601:645:8700:2290:890f:d3a0:aab0:f3f) (Ping timeout: 240 seconds) |
| 00:28:13 | → | wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com) |
| 00:28:13 | × | wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
| 00:28:13 | → | wroathe joins (~wroathe@user/wroathe) |
| 00:30:46 | → | alx741 joins (~alx741@157.100.197.240) |
| 00:32:36 | × | [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Ping timeout: 240 seconds) |
| 00:34:02 | → | machinedgod joins (~machinedg@24.105.81.50) |
| 00:34:08 | × | zincy_ quits (~zincy@2a00:23c8:970c:4801:39f9:90f7:922:e73b) (Remote host closed the connection) |
| 00:35:30 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 00:36:47 | → | [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470) |
| 00:38:28 | × | prolic quits (~prolic@181.122.131.227) (Remote host closed the connection) |
| 00:38:48 | → | prolic joins (~prolic@181.122.131.227) |
| 00:40:28 | × | prolic quits (~prolic@181.122.131.227) (Remote host closed the connection) |
| 00:40:32 | → | nabaiste^ joins (~nabaiste@50.233.120.162) |
| 00:40:46 | → | prolic joins (~prolic@181.122.131.227) |
| 00:43:44 | × | eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b580:ab83:1b56:af3b) (Remote host closed the connection) |
| 00:44:01 | → | eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) |
| 00:45:04 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection) |
| 00:45:29 | × | shiraeeshi quits (~shiraeesh@109.166.56.8) (Remote host closed the connection) |
| 00:45:30 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 00:47:10 | × | prolic quits (~prolic@181.122.131.227) (Remote host closed the connection) |
| 00:47:28 | → | prolic joins (~prolic@181.122.131.227) |
| 00:51:26 | × | prolic quits (~prolic@181.122.131.227) (Remote host closed the connection) |
| 00:51:42 | → | alx741 joins (~alx741@157.100.197.240) |
| 00:51:45 | → | prolic joins (~prolic@181.122.131.227) |
| 00:53:26 | × | prolic quits (~prolic@181.122.131.227) (Remote host closed the connection) |
| 00:53:43 | → | prolic joins (~prolic@181.122.131.227) |
| 00:55:39 | × | prolic quits (~prolic@181.122.131.227) (Remote host closed the connection) |
| 00:55:59 | → | prolic joins (~prolic@181.122.131.227) |
| 00:58:13 | × | jtomas quits (~jtomas@210.red-88-24-179.staticip.rima-tde.net) (Ping timeout: 256 seconds) |
| 00:58:19 | × | theproffesor quits (~theproffe@user/theproffesor) (Read error: Connection reset by peer) |
| 00:59:20 | → | rekahsoft joins (~rekahsoft@cpe0008a20f982f-cm64777d666260.cpe.net.cable.rogers.com) |
| 00:59:33 | × | jonathanx quits (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) (Remote host closed the connection) |
| 00:59:51 | → | jonathanx joins (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) |
| 00:59:51 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 01:04:06 | × | alp quits (~alp@user/alp) (Ping timeout: 260 seconds) |
| 01:06:26 | × | prolic quits (~prolic@181.122.131.227) (Remote host closed the connection) |
| 01:06:43 | × | dhil quits (~dhil@cpc103052-sgyl39-2-0-cust260.18-2.cable.virginm.net) (Ping timeout: 256 seconds) |
| 01:06:44 | → | prolic joins (~prolic@181.122.131.227) |
| 01:07:33 | <prolic> | resolved it, FYI |
| 01:09:51 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 256 seconds) |
| 01:10:37 | × | albet70 quits (~xxx@2400:8902::f03c:92ff:fe60:98d8) (Remote host closed the connection) |
| 01:12:56 | × | prolic quits (~prolic@181.122.131.227) (Remote host closed the connection) |
| 01:14:25 | → | merijn joins (~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) |
| 01:14:48 | → | wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com) |
| 01:14:48 | × | wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
| 01:14:48 | → | wroathe joins (~wroathe@user/wroathe) |
| 01:16:43 | → | albet70 joins (~xxx@2400:8902::f03c:92ff:fe60:98d8) |
| 01:16:44 | → | alx741 joins (~alx741@157.100.197.240) |
| 01:19:31 | <sm> | how, prolic ? |
| 01:20:33 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 01:20:37 | × | jle` quits (~jle`@cpe-23-240-75-236.socal.res.rr.com) (Ping timeout: 256 seconds) |
| 01:21:57 | → | shiraeeshi joins (~shiraeesh@109.166.56.8) |
| 01:22:22 | → | jle` joins (~jle`@cpe-23-240-75-236.socal.res.rr.com) |
| 01:26:16 | → | fresheyeball joins (~fresheyeb@c-76-25-93-164.hsd1.co.comcast.net) |
| 01:26:53 | <fresheyeball> | It is a member of the hidden package ‘ghc-lib-parser-9.2.1.20211101’. |
| 01:26:55 | <fresheyeball> | Perhaps you need to add ‘ghc-lib-parser’ to the build-depends in your .cabal file. |
| 01:26:58 | <fresheyeball> | but it IS there |
| 01:27:01 | <fresheyeball> | it's in the .cabal file |
| 01:27:07 | <fresheyeball> | This happens every so often |
| 01:27:26 | <fresheyeball> | I forget how to resolve |
| 01:27:32 | <fresheyeball> | I did an rm -rf dist* |
| 01:27:34 | <fresheyeball> | cabal clean |
| 01:27:36 | <fresheyeball> | all that stuff |
| 01:27:38 | <fresheyeball> | no dice |
| 01:31:36 | <sm> | fresheyeball: is it in the build-depends for each component in the cabal file that needs it ? |
| 01:36:17 | <Artem[m]> | fresheyeball: may be helpful to post (a link to) the whole .cabal file here |
| 01:36:45 | → | alx741 joins (~alx741@157.100.197.240) |
| 01:38:32 | → | mshiraeeshi joins (~shiraeesh@109.166.56.8) |
| 01:38:35 | × | shiraeeshi quits (~shiraeesh@109.166.56.8) (Read error: No route to host) |
| 01:38:53 | → | mon_aaraj joins (~MonAaraj@user/mon-aaraj/x-4416475) |
| 01:45:13 | <DigitalKiwi> | hi fresheyeball |
| 01:45:30 | <fresheyeball> | DigitalKiwi: howdy! |
| 01:45:35 | <fresheyeball> | sm: http://ix.io/3Q08 |
| 01:45:38 | <fresheyeball> | Artem[m]: ^ |
| 01:46:58 | <sm> | no library component.. is that legal ? |
| 01:47:27 | <sm> | I guess it is |
| 01:48:12 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 01:48:14 | <sm> | fresheyeball: and if you like, paste the full cabal build log |
| 01:48:23 | × | merijn quits (~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) (Ping timeout: 256 seconds) |
| 01:48:50 | → | cynomys joins (~cynomys@user/cynomys) |
| 01:49:57 | <fresheyeball> | sm: what do you mean? |
| 01:50:46 | <fresheyeball> | http://ix.io/3Q0a |
| 01:50:54 | <fresheyeball> | that maybe? |
| 01:51:28 | <fresheyeball> | now I got 2 errors |
| 01:54:21 | × | cynomys quits (~cynomys@user/cynomys) (Ping timeout: 272 seconds) |
| 01:54:49 | → | cynomys joins (~cynomys@user/cynomys) |
| 01:56:16 | <octeep[m]> | Is there a way to catch exception thrown by Text.Printf (I have to use something similar to UNIX printf). I've tried handle and try from Control.Exception, but none of it seems to catch the exception at all. |
| 01:56:56 | <FernandoChu[m]> | is there a way to hide the implementation of type classes for `[]` so I can make my own? |
| 01:57:37 | × | lottaquestions quits (~nick@2607:fa49:5041:a200:c52d:7d43:3699:c92e) (Quit: Konversation terminated!) |
| 01:57:47 | <fresheyeball> | FernandoChu[m]: -NoImplicitPrelude |
| 01:57:56 | <fresheyeball> | then import what you need only |
| 02:02:35 | × | machinedgod quits (~machinedg@24.105.81.50) (Ping timeout: 272 seconds) |
| 02:02:39 | × | jao quits (~jao@static-68-235-44-54.cust.tzulo.com) (Remote host closed the connection) |
| 02:03:33 | × | jonathanx quits (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) (Remote host closed the connection) |
| 02:03:51 | → | jonathanx joins (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) |
| 02:04:04 | <Artem[m]> | Fernando Chu: I hope you're asking for purely educational purposes. In practice, you'd wrap [] into a newtype and define your instances for it. |
| 02:04:39 | <Artem[m]> | fresheyeball: looks legit; trying it locally. No bounds on packages are a bit suspicious though |
| 02:06:01 | <FernandoChu[m]> | <fresheyeball> "then import what you need only" <- thanks, but now it's complaining that it exits in GHC.Base, I also did `import GHC.Base ()` but I get the same error |
| 02:06:12 | <FernandoChu[m]> | Artem[m]: haha yeah, don't worry |
| 02:06:21 | → | alx741 joins (~alx741@181.199.42.143) |
| 02:06:25 | <jackdk> | Even if you import no names from a module, you still get instances |
| 02:06:36 | <fresheyeball> | FernandoChu[m]:oh right I forgot you still get the instances |
| 02:07:27 | <fresheyeball> | FernandoChu[m]: maybe just write your own classes? |
| 02:07:44 | <fresheyeball> | instance Functor' f where fmap' :: ... |
| 02:08:08 | <FernandoChu[m]> | according to this I can't hide the instances damn https://stackoverflow.com/questions/54835367/hiding-typeclass-instance-declarations-while-importing-in-haskellk |
| 02:08:17 | <Artem[m]> | guys, why getting out of your way instead of simply newtype... |
| 02:08:27 | <sm> | fresheyeball: two problem signs are: 1. "Build profile: -w ghc-8.10.7" vs "ghc-lib-9.2.1.20211101" (ghc version mismatch ?) and 2. "The package list for 'hackage.haskell.org' is 97 days old." |
| 02:08:40 | <FernandoChu[m]> | the problem with making my own is then I'd have to remake all that depends on Functor too |
| 02:08:57 | <fresheyeball> | FernandoChu[m]: backpack? |
| 02:09:10 | <fresheyeball> | sm: interesting |
| 02:09:13 | <FernandoChu[m]> | Artem[m]: yeah I'll do that, just was wondering if there was another way |
| 02:09:13 | <Artem[m]> | sm: in theory, it's the whole deal of `ghc-lib` that you're no longer bound to the host GHC |
| 02:09:23 | <sm> | ha |
| 02:09:28 | <fresheyeball> | ok |
| 02:11:40 | <fresheyeball> | looks like a GHC version mismatch |
| 02:13:32 | <FernandoChu[m]> | also, what does a `!` before a type means? |
| 02:20:25 | <sm> | Fernando Chu: evaluate it (somewhat) strictly |
| 02:21:25 | <FernandoChu[m]> | sm: thanks, could I get some kind of name for that to search references? I haven't been able to find it |
| 02:21:41 | <sm> | "bang notation" maybe |
| 02:21:59 | <sm> | "strictness annotations" |
| 02:22:18 | <sm> | https://downloads.haskell.org/ghc/latest/docs/html/users_guide/search.html?q=strictness&check_keywords=yes&area=default |
| 02:23:48 | <FernandoChu[m]> | thank you |
| 02:24:29 | × | alx741 quits (~alx741@181.199.42.143) (Read error: Connection reset by peer) |
| 02:26:09 | × | pretty_dumm_guy quits (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Quit: WeeChat 3.4) |
| 02:27:13 | → | dyeplexer joins (~dyeplexer@user/dyeplexer) |
| 02:27:17 | → | pretty_dumm_guy joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) |
| 02:29:42 | × | pretty_dumm_guy quits (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) (Client Quit) |
| 02:33:13 | <Artem[m]> | fresheyeball: just finished building with your cabal file and a Main that has just two imports indicated in the error message you posted: it has built successfully with GHC 8.10.7 and ghc-lib-(parser-)9.2.1.20220109. The problem is on your end!.. I know, this is not helpful. But at least the cabal file you posted seems fine. |
| 02:34:32 | × | justGhost quits (~justache@user/justache) (Read error: Connection reset by peer) |
| 02:35:00 | × | cynomys quits (~cynomys@user/cynomys) (Ping timeout: 240 seconds) |
| 02:35:12 | <sm> | oh.. what about a cabal update then ? |
| 02:35:22 | × | fresheyeball quits (~fresheyeb@c-76-25-93-164.hsd1.co.comcast.net) (Quit: WeeChat 3.3) |
| 02:35:30 | → | justGhost joins (~justache@user/justache) |
| 02:35:48 | × | notzmv quits (~zmv@user/notzmv) (Ping timeout: 240 seconds) |
| 02:35:50 | → | harveypwca joins (~harveypwc@2601:246:c180:a570:3828:d8:e523:3f67) |
| 02:36:24 | <sm> | fresh out of eyeballs. we'll never know. |
| 02:37:08 | × | unyu quits (~pyon@user/pyon) (Quit: brb) |
| 02:39:19 | <Artem[m]> | yes, a reasonably recent cabal may help |
| 02:40:38 | × | Vajb quits (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer) |
| 02:41:36 | → | alx741 joins (~alx741@157.100.197.240) |
| 02:41:52 | → | cynomys joins (~cynomys@user/cynomys) |
| 02:41:53 | × | Topsi quits (~Tobias@dyndsl-095-033-091-109.ewe-ip-backbone.de) (Read error: Connection reset by peer) |
| 02:42:30 | → | tzh joins (~tzh@c-24-21-73-154.hsd1.or.comcast.net) |
| 02:46:16 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 02:50:14 | <sm> | that too, but I meant just `cabal update` |
| 02:50:57 | × | xff0x quits (~xff0x@2001:1a81:5290:8400:55c0:f8c1:431:6807) (Ping timeout: 240 seconds) |
| 02:53:05 | → | xff0x joins (~xff0x@2001:1a81:52c9:2700:23a4:7c27:1274:b7bc) |
| 02:55:14 | <chronon> | How should I verbalise the syntax <- when reading Haskell code out loud, or to myself even? |
| 02:55:56 | <ski> | in list comprehensions, `do'-notation, or pattern guards ? |
| 02:58:22 | <chronon> | I'm just reading a tutorial for the first time so I'm not sure. I've seen <- appearing inside [] and after "do". |
| 02:58:48 | <ski> | "inside []" would be list comprehensions |
| 03:00:01 | <chronon> | What does <- mean, and how would you read this to yourself? |
| 03:00:22 | <ski> | > [(x,y) | x <- [0 .. 3],y <- [0 .. x]] -- the list of all pairs `(x,y)', where `x' is drawn from the list `[0 .. 3]' (`x' lies inbetween `0' and `3'), and `y' is drawn from the list `[0 .. x]' (`y' lies inbetween `0' and `x') |
| 03:00:24 | <lambdabot> | [(0,0),(1,0),(1,1),(2,0),(2,1),(2,2),(3,0),(3,1),(3,2),(3,3)] |
| 03:01:13 | <chronon> | Ah, so "drawn from" is how to read <- |
| 03:01:47 | <ski> | `x <- [0 .. 3]' is called a "generator". it generates possible values for `x', by drawing them from the list |
| 03:01:50 | <chronon> | Same after "do", right? |
| 03:01:56 | <ski> | more or less |
| 03:02:06 | <chronon> | Ok, thanks. |
| 03:02:08 | <ski> | although that's more general (doesn't have to be about lists) |
| 03:02:46 | → | alx741 joins (~alx741@157.100.197.240) |
| 03:02:57 | <ski> | > do x <- [0 .. 3],y <- [0 .. x]; return (x,y) -- select `x' nondeterministically from `[0 .. 3]', and `y' from `[0 .. x]', yielding `(x,y)' as a result |
| 03:02:58 | <lambdabot> | <hint>:1:17: error: parse error on input ‘,’ |
| 03:03:00 | <chronon> | It might seem like an odd question but reading example code without being able to verbalise what I'm reading proved to be a bit disorientating. |
| 03:03:04 | <ski> | > do x <- [0 .. 3]; y <- [0 .. x]; return (x,y) -- select `x' nondeterministically from `[0 .. 3]', and `y' from `[0 .. x]', yielding `(x,y)' as a result |
| 03:03:06 | <lambdabot> | [(0,0),(1,0),(1,1),(2,0),(2,1),(2,2),(3,0),(3,1),(3,2),(3,3)] |
| 03:03:56 | <ski> | more generally, in `do', you could read `x <- act' as "bind `x' to the result of executing the action `act'" |
| 03:04:25 | <ski> | (in case of lists, "executing an action" amounts to selecting an element from a list in all possible ways) |
| 03:05:10 | × | cynomys quits (~cynomys@user/cynomys) (Ping timeout: 256 seconds) |
| 03:05:17 | × | Ariakenom_ quits (~Ariakenom@h-82-196-111-63.NA.cust.bahnhof.se) (Ping timeout: 272 seconds) |
| 03:05:29 | <chronon> | So that's similar in concept to an assignment in other languages, I guess. |
| 03:05:32 | <ski> | no |
| 03:05:49 | <ski> | assignment means *changing* the value which is stored in a location |
| 03:06:00 | <chronon> | Binding names to values is assignment, isn't it? |
| 03:06:03 | <ski> | this is not about changing, this is about binding a new variable to a value |
| 03:06:08 | <ski> | no, it's not |
| 03:06:16 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 03:06:44 | <ski> | in C, `int x = 5;' binds the identifier `x' to a fresh location, and initializes that location to the value `5' |
| 03:06:55 | <ski> | the binding of `x' to that location is immutable, can't be changed |
| 03:07:02 | <chronon> | Ok, I see the distinction you're making. I'll use the word "bind" not "assign". |
| 03:08:01 | <ski> | > do x <- [0 .. 3]; x <- [0 .. x]; return x -- this is not assignment, it is shadowing |
| 03:08:03 | <lambdabot> | [0,0,1,0,1,2,0,1,2,3] |
| 03:08:58 | <ski> | (`<-'-bindings are non-recursive (unless you use the `rec' keyword (extension))) |
| 03:09:30 | <chronon> | Oh, that's over my head. I'll have to read this tutorial first. |
| 03:09:37 | <chronon> | Thanks for now.... |
| 03:10:09 | <ski> | > do x <- [0 .. 3]; y <- [0 .. x]; return y -- this is the same thing as just before, only renaming the "inner" `x' to `y' |
| 03:10:11 | <lambdabot> | [0,0,1,0,1,2,0,1,2,3] |
| 03:11:04 | <ski> | chronon : btw, it should be clear that any list comprehension could also alternatively be written using `do', using a very simple rewriting |
| 03:12:17 | <ski> | (in fact, there's even an extension for being able to use list comprehension syntax for arbitrary monads (which you'd often otherwise express using `do'), not just for lists) |
| 03:13:10 | <ski> | anyway, have fun with your Haskell learning :) |
| 03:13:23 | → | lavaman joins (~lavaman@98.38.249.169) |
| 03:13:51 | → | Vajb joins (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) |
| 03:14:09 | <chronon> | I'm sure I will. Learning new languages is one of my favourite things to do. :-) |
| 03:18:12 | × | mon_aaraj quits (~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 240 seconds) |
| 03:19:34 | × | FinnElija quits (~finn_elij@user/finn-elija/x-0085643) (Remote host closed the connection) |
| 03:19:54 | → | FinnElija joins (~finn_elij@user/finn-elija/x-0085643) |
| 03:20:37 | → | mon_aaraj joins (~MonAaraj@user/mon-aaraj/x-4416475) |
| 03:22:48 | → | alx741 joins (~alx741@181.199.42.143) |
| 03:25:51 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 256 seconds) |
| 03:26:07 | → | wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com) |
| 03:26:08 | × | wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
| 03:26:08 | → | wroathe joins (~wroathe@user/wroathe) |
| 03:27:27 | × | td_ quits (~td@94.134.91.32) (Ping timeout: 272 seconds) |
| 03:28:37 | → | td_ joins (~td@94.134.91.184) |
| 03:28:38 | × | alx741 quits (~alx741@181.199.42.143) (Read error: Connection reset by peer) |
| 03:29:17 | → | alx741 joins (~alx741@157.100.197.240) |
| 03:29:20 | → | cynomys joins (~cynomys@user/cynomys) |
| 03:30:19 | × | xkuru quits (~xkuru@user/xkuru) (Read error: Connection reset by peer) |
| 03:32:00 | <chronon> | In ghci, how do I ask it to show me the current err... "equations" for a given function name? |
| 03:33:52 | × | mon_aaraj quits (~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 250 seconds) |
| 03:33:53 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 03:36:00 | → | mon_aaraj joins (~MonAaraj@user/mon-aaraj/x-4416475) |
| 03:38:01 | × | cynomys quits (~cynomys@user/cynomys) (Ping timeout: 256 seconds) |
| 03:38:08 | <chronon> | I found :show bindings in the :help, but this shows all of the functions I defined, not just those of a given name, and if I append the name to :show bindings I get a syntax error. |
| 03:42:18 | × | Vajb quits (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer) |
| 03:44:09 | → | Vajb joins (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) |
| 03:46:16 | → | irishman joins (~vshev4enk@178.151.117.243) |
| 03:48:57 | × | mon_aaraj quits (~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 240 seconds) |
| 03:50:15 | × | troydm quits (~troydm@host-176-37-124-197.b025.la.net.ua) (Ping timeout: 272 seconds) |
| 03:50:30 | × | irishman quits (~vshev4enk@178.151.117.243) (Ping timeout: 256 seconds) |
| 03:50:37 | → | troydm joins (~troydm@host-176-37-124-197.b025.la.net.ua) |
| 03:51:21 | → | mon_aaraj joins (~MonAaraj@user/mon-aaraj/x-4416475) |
| 03:51:42 | → | alx741 joins (~alx741@157.100.197.240) |
| 03:56:23 | <chronon> | Also, the output of :show bindings seems to be the type signature only, rather than the definition. |
| 03:56:50 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 250 seconds) |
| 03:57:52 | × | mon_aaraj quits (~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 256 seconds) |
| 03:59:41 | → | mon_aaraj joins (~MonAaraj@user/mon-aaraj/x-4416475) |
| 04:00:01 | × | haasn quits (~nand@haasn.dev) (Quit: ZNC 1.7.5+deb4 - https://znc.in) |
| 04:00:52 | → | yauhsien joins (~yauhsien@61-231-37-106.dynamic-ip.hinet.net) |
| 04:01:15 | <chronon> | What am I doing wrong here: |
| 04:01:15 | <chronon> | prod [] = 1 |
| 04:01:15 | <chronon> | prod (x:xs) = x * prod xs |
| 04:01:15 | <chronon> | prod [1..5] |
| 04:01:15 | <chronon> | *** Exception: <interactive>:2:1-25: Non-exhaustive patterns in function prod |
| 04:01:15 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 04:01:23 | → | haasn joins (~nand@haasn.dev) |
| 04:01:58 | <dsal> | chronon: Are you just pasting those lines into ghci? |
| 04:02:09 | <chronon> | I typed them in. |
| 04:02:20 | <dsal> | Well, same thing. You defined prod, and then you redefined prod. |
| 04:02:31 | <dsal> | ghci is a slightly confusing environment. Better off writing things in a file. |
| 04:03:05 | → | wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com) |
| 04:03:05 | × | wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
| 04:03:05 | → | wroathe joins (~wroathe@user/wroathe) |
| 04:03:12 | × | alphabeta quits (~kilolympu@31.205.200.235) (Quit: Quitting IRC :() |
| 04:03:21 | <chronon> | I thought that the params were pat of the definition and you could define different equations under the same name. |
| 04:03:34 | <chronon> | s/pat/part/ |
| 04:03:58 | <dsal> | Yes, but ghci is a different thing. |
| 04:04:11 | <dsal> | If you were doing that in a file, it'd be a lot less confusing. |
| 04:04:22 | <chronon> | Is ghci really no good for this kind of experimentation? |
| 04:04:24 | <dsal> | ghci is good for some kinds of exploration, but it's not a good plcae to write code. |
| 04:04:37 | <dsal> | People don't write code in ghci. :) |
| 04:04:43 | <chronon> | Oh. |
| 04:05:31 | × | yauhsien quits (~yauhsien@61-231-37-106.dynamic-ip.hinet.net) (Ping timeout: 256 seconds) |
| 04:06:24 | <chronon> | Ok, so what is the most convenient way to experiment while I learn? Do I just put the lines of code in a file and then run ghc filename or something? |
| 04:07:47 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 256 seconds) |
| 04:10:09 | <ski> | use `:r' to reload files into the interactor, after saving in editor |
| 04:11:08 | <ski> | (short for `:reload'. you can also use `:l' (`:load') if you didn't pass the filename when starting the interactor) |
| 04:12:17 | <ski> | anyway, if you define things in a file, then you can define things out of order (use things, then define them later in the file). also recursion (including mutual recursion) |
| 04:13:19 | <ski> | in the interactor, each new binding (potentially) shadows the old. if you want to enter multiple declarations (including defining equations) at the same time, you can start with `:{' and end with `:}' (that would make your `prod' example work) |
| 04:13:23 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:13:38 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:13:46 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:13:52 | <ski> | (alternatively, you could enter multiple declarations, all in one go, separating them by `;' instead of by newlines) |
| 04:13:52 | <chronon> | Ah, ok, I'll try that. Thanks. |
| 04:13:59 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:14:07 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:14:17 | × | little_mac quits (~little_ma@2601:410:4300:3ce0:3581:2989:c5ee:9353) (Quit: Leaving) |
| 04:14:17 | <chronon> | That also sounds convenient. |
| 04:14:19 | <ski> | but, for anything more complicated than simple stuff, it's more convenient to simply type it up into your editor of choice |
| 04:14:22 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:14:29 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:14:43 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:14:50 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:15:05 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:15:12 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:15:28 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:15:30 | <ski> | there's also an `:e' (`:edit') command, which you could set up to start Vi or Emacs (or Emacsclient) or something. when that editor command terminates, the interactor will (iirc) automatically reload any loaded files that you've changed |
| 04:15:34 | → | little_mac joins (~little_ma@2601:410:4300:3ce0:24a8:40ee:fe3d:56e6) |
| 04:15:35 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:15:49 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:15:50 | × | Vajb quits (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer) |
| 04:15:56 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:16:11 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:16:13 | <chronon> | If I start ghci with the filename containing the two equations of prod, it says: target ‘prod’ is not a module name or a source file |
| 04:16:18 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:16:32 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:16:33 | <ski> | try `ghci prod.hs' ? |
| 04:16:39 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:16:54 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:16:57 | <chronon> | Oh, it *requires* a .hs extension? |
| 04:17:01 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:17:11 | <ski> | it takes a filename, yes |
| 04:17:17 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:17:24 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:17:29 | <chronon> | I tend not to use filename extensions on scripts. |
| 04:17:38 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:17:39 | → | alx741 joins (~alx741@157.100.197.240) |
| 04:17:46 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:17:46 | <chronon> | So I just called the file prod |
| 04:18:00 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:18:07 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:18:22 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:18:29 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:18:44 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:18:51 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:19:05 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:19:12 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:19:27 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:19:34 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:19:49 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:19:56 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:20:10 | <chronon> | I do indeed get different behaviour depending on the filename. Wow, how very MS Windows. |
| 04:20:10 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:20:17 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:20:32 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:20:39 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:20:44 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 04:20:54 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:21:01 | <dsal> | Haskell isn't a scripting language, so it's not going to be a problem in the long term. |
| 04:21:01 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:21:10 | <dsal> | You're optimizing a bit for things that don't come up all that often. |
| 04:21:16 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:21:17 | × | burnsidesLlama quits (~burnsides@dhcp168-022.wadham.ox.ac.uk) (Remote host closed the connection) |
| 04:21:23 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:21:37 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:21:44 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:21:48 | <chronon> | Hmmm, probably just my past experience getting in the way. |
| 04:21:59 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:22:06 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:22:22 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:22:29 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:22:43 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:22:50 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:23:06 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:23:07 | <chronon> | The super simple two line definition of prod is giving this error as I start ghci on it: Parse error: module header, import declaration or top-level declaration expected. |
| 04:23:13 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:23:28 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:23:35 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:23:40 | <chronon> | Ah, it's my problem. A typo. |
| 04:23:50 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:23:57 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:24:12 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:24:19 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:24:34 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:24:41 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:24:57 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:25:04 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:25:18 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:25:25 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:25:40 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:25:48 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:26:02 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:26:08 | <chronon> | The :e thing seems like the quickest way to work. Thanks. |
| 04:26:09 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:26:23 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:26:30 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:26:45 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:26:46 | <dsal> | It's a good idea to get into the habit of declaring types. It may seem a bit foreign, but types are the things you're mostly going to be reading. |
| 04:26:49 | <dsal> | :t product |
| 04:26:50 | <lambdabot> | (Foldable t, Num a) => t a -> a |
| 04:26:52 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:27:06 | → | lavaman joins (~lavaman@98.38.249.169) |
| 04:27:12 | ChanServ | sets mode +o litharge |
| 04:27:13 | litharge | sets mode +b lavaman!~lavaman@98.38.249.169$##fix-your-connection |
| 04:27:13 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 04:27:23 | litharge | sets mode -o litharge |
| 04:28:28 | <chronon> | Foldable? Err... I think I need to read more tutorial before getting to that. |
| 04:28:41 | <ski> | product :: [Integer] -> Integer |
| 04:28:45 | <ski> | or |
| 04:28:54 | <ski> | product :: Num a => [a] -> a |
| 04:29:06 | <ski> | is probably nicest to start with |
| 04:29:30 | → | Vajb joins (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) |
| 04:30:28 | × | Unicorn_Princess quits (~Unicorn_P@93-103-228-248.dynamic.t-2.net) (Remote host closed the connection) |
| 04:30:34 | <ski> | (well, s/product/prod/, in your case) |
| 04:31:37 | <chronon> | Ok, that seems to go at the top of the file without causing errors, so I must have understood it well enough. |
| 04:32:49 | <ski> | normally people would put the type signature just before the corresponding defining equations. occasionally, you'll see it appear earlier (e.g. if multiple operations all share the same signature, in which case you can declare them all at once, instead of repeating the signature) |
| 04:33:14 | <chronon> | Ok got it. |
| 04:33:33 | <ski> | sum,prod :: [Integer] -> Integer -- e.g. |
| 04:34:16 | <ski> | btw <https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/ghci.html#modules-vs-filenames> |
| 04:36:14 | → | unyu joins (~pyon@user/pyon) |
| 04:37:21 | <chronon> | Ah, thanks. |
| 04:38:57 | × | Erutuon quits (~Erutuon@user/erutuon) (Ping timeout: 256 seconds) |
| 04:39:16 | → | alx741 joins (~alx741@181.199.42.143) |
| 04:39:25 | <chronon> | Taht webpage looks very much like a readthedocs/Sphinx style document. IS that something that can be autogenerated using haddock or similar tool? |
| 04:41:33 | → | Erutuon joins (~Erutuon@user/erutuon) |
| 04:45:19 | → | theproffesor joins (~theproffe@user/theproffesor) |
| 04:46:25 | <chronon> | Nevermind. Too open kind of question that, I can tell. ;-) |
| 04:47:03 | → | yauhsien joins (~yauhsien@61-231-37-106.dynamic-ip.hinet.net) |
| 04:47:44 | × | waleee quits (~waleee@h-98-128-229-110.NA.cust.bahnhof.se) (Ping timeout: 256 seconds) |
| 04:47:51 | <dsal> | chronon: Sorry, I'm a bit in and out. I didn't mean to use that exactly. It's a bit too abstract of an example, yeah. but declare the thing you think you want and then try to make it work. |
| 04:47:52 | × | alx741 quits (~alx741@181.199.42.143) (Read error: Connection reset by peer) |
| 04:50:21 | × | lagash quits (lagash@lagash.shelltalk.net) (Quit: ZNC - https://znc.in) |
| 04:55:13 | × | yauhsien quits (~yauhsien@61-231-37-106.dynamic-ip.hinet.net) (Remote host closed the connection) |
| 04:55:16 | → | lagash joins (lagash@lagash.shelltalk.net) |
| 04:55:34 | <chronon> | np |
| 04:56:09 | → | yauhsien joins (~yauhsien@61-231-37-106.dynamic-ip.hinet.net) |
| 04:57:13 | ChanServ | sets mode +o litharge |
| 04:57:14 | litharge | sets mode -bo lavaman!~lavaman@98.38.249.169$##fix-your-connection litharge |
| 04:58:33 | → | mike11 joins (~Mike@user/mike11) |
| 04:58:39 | → | notzmv joins (~zmv@user/notzmv) |
| 04:59:11 | <ski> | it is also possible (on a *nix system) to write shebangs like having the first line be `#!/usr/bin/env runhaskell'. then the filename needn't end in `.hs' or `.lhs' (literate). but then it would start execution at `main', rather than load the file into the interactor |
| 05:00:16 | <ski> | hm, after testing around a little, it appears that `#!/usr/bin/env -S ghci -x hs' here allows the file to be loaded into the interactor, without needing to have a name ending in `.hs' (and without needing `main' to be defined) |
| 05:00:20 | <ski> | chronon ^ |
| 05:00:43 | <chronon> | Interesting. |
| 05:01:03 | × | yauhsien quits (~yauhsien@61-231-37-106.dynamic-ip.hinet.net) (Ping timeout: 256 seconds) |
| 05:01:32 | <chronon> | I do like running scripts with shebang. Keeping separate source and executable for small stuff is a bit overkill. |
| 05:01:45 | <ski> | <https://stackoverflow.com/questions/14018282/how-to-embed-haskell-in-a-batch-file-hash-bang-runhaskell-for-windows> apparently gives some answer for what could be done to make batch running (like shebang), on Windows |
| 05:02:24 | <chronon> | Fortunately, I do not have the handicap of needing to use Windows. Ever. |
| 05:03:05 | → | yauhsien joins (~yauhsien@61-231-37-106.dynamic-ip.hinet.net) |
| 05:04:31 | → | alx741 joins (~alx741@181.199.42.143) |
| 05:06:53 | <chronon> | Where did this site go? https://ghc.readthedocs.io/ |
| 05:08:49 | → | Null_A joins (~null_a@2601:645:8700:2290:890f:d3a0:aab0:f3f) |
| 05:11:32 | <dsal> | IMO, trying to shebang a script in Haskell is a path to unnecessary frustration. |
| 05:11:55 | <dsal> | You're probably going to want some libraries among other requirements. |
| 05:13:24 | × | Null_A quits (~null_a@2601:645:8700:2290:890f:d3a0:aab0:f3f) (Ping timeout: 240 seconds) |
| 05:13:56 | × | alx741 quits (~alx741@181.199.42.143) (Read error: Connection reset by peer) |
| 05:14:18 | <chronon> | Libraries can be inported by the script presumably? |
| 05:14:21 | → | lavaman joins (~lavaman@98.38.249.169) |
| 05:18:36 | × | lavaman quits (~lavaman@98.38.249.169) (Ping timeout: 240 seconds) |
| 05:20:32 | <dsal> | I'm not sure how you're thinking of that, but most surely not. |
| 05:21:42 | <dsal> | I've got a lot of haskell projects that use a lot of libraries, some of which aren't version compatible with each other. |
| 05:21:58 | <chronon> | Well, most languages allow sourcec files to specify the inclusion of other source files, and/or use of particular libraries, by declaring them at the top of the file. |
| 05:22:42 | <dsal> | That's almost entirely untrue in my experience. Can you give an example? |
| 05:22:43 | <chronon> | I'm jumping the gun. Probably best for me to read on and wait to find out how to do library imports. |
| 05:24:44 | <chronon> | If there is a widespread issue with libraries having multiple incompatible versions then that is an ecosystem failing. There should be a central registry for libarary names, and a cultural attitude towards ensuring that later versions of libraries do not break backward compatibility. |
| 05:29:25 | <chronon> | You can't build reliable software when there is a chaotic free-for-all in the library ecosystem. |
| 05:29:50 | <chronon> | I think (hope) you must be exaggerating the problem. |
| 05:30:50 | <dsal> | No, you just restated it, though. If you just throw an import at the top of a file, how should it resolve? |
| 05:30:55 | → | alx741 joins (~alx741@181.199.42.143) |
| 05:31:05 | × | rekahsoft quits (~rekahsoft@cpe0008a20f982f-cm64777d666260.cpe.net.cable.rogers.com) (Ping timeout: 256 seconds) |
| 05:31:07 | <dsal> | If you run your script again tomorrow, should it get library updates and maybe break, or somehow know to not update? |
| 05:31:39 | <chronon> | It should get the latest version and that should work just like the previous version. |
| 05:31:53 | <dsal> | Uh. That's a terrible, and unprecedented idea. |
| 05:32:05 | <chronon> | If the API contract is broken in a latr version then the later version should not have the same name. The name is the contract. |
| 05:32:41 | <dsal> | The newest version of the amazon interface has a large number of major API changes which greatly improve a lot of things. Most programs will ignore the new version until they're ready. |
| 05:32:42 | <chronon> | Maybe we're not talking about the same thing. |
| 05:33:49 | <dsal> | This is primarily how we manage compatibility: https://pvp.haskell.org (well, the base bit) |
| 05:33:58 | <dsal> | We have a few abstractions above this. |
| 05:34:49 | × | yauhsien quits (~yauhsien@61-231-37-106.dynamic-ip.hinet.net) (Remote host closed the connection) |
| 05:34:54 | <dsal> | The point is that "a script" isn't going to express any of these things. It's not impossible, but it's a lot harder than just making a project and declaring what you need. |
| 05:35:06 | <chronon> | Hmmm, version dependencies should always be minimums, not also maximums. |
| 05:35:35 | <dsal> | Lots of people with production systems disagree with you. :) |
| 05:35:35 | × | alx741 quits (~alx741@181.199.42.143) (Read error: Connection reset by peer) |
| 05:35:56 | <dsal> | When the next amazonka version ships should your programs all stop running? |
| 05:36:19 | <dsal> | Because if you don't put effort into applying the API changes, you're going to have a bad day if you don't have a max version constraint. |
| 05:38:02 | <chronon> | Looks like the dotted version numbers in the document you linked do indeed allow version numbers to increase and for the user of the module to be confident nothing will break. It is just that they have made breaking changes part of a more significant part of the version number, rather than making that a naming issue. So it's swings and roundabouts. |
| 05:39:03 | × | mike11 quits (~Mike@user/mike11) (Quit: Leaving.) |
| 05:39:05 | × | slowButPresent quits (~slowButPr@user/slowbutpresent) (Quit: leaving) |
| 05:39:39 | → | yauhsien joins (~Yau-Hsien@61-231-37-106.dynamic-ip.hinet.net) |
| 05:39:41 | dagit3146 | is now known as dagit |
| 05:39:57 | <chronon> | Personallly, I think that culturally there should be a greater emphasis on allowing imrovemnts that do not break things. |
| 05:40:27 | <dsal> | I can't even imagine how you could expect something like that to work. |
| 05:41:08 | <chronon> | It works like that everywher eoutside the Haskell community. It's basic practise in software engineering to honour the API. |
| 05:41:23 | <chronon> | But I think we must be talking about different things. |
| 05:41:48 | <dsal> | It's possible. I've used a large number of languages over the last few decades and don't have much experience that matches what you're saying. |
| 05:41:57 | <chronon> | BEcause I simply cannot believe that anyone thinks it is good to change the API with every version bump. |
| 05:42:31 | <dsal> | It's the other way around. If you change the API, you do a major version bump. |
| 05:42:39 | <dsal> | If the alternative is "you can never fix anything" then that seems like a bad idea. |
| 05:45:34 | <chronon> | Well, I think it is a question of priorities and emphasis. By allowing breaking changes across different major versions of a library, you are saying that change is favoured over stability. Whereas, if your ecosystem says that a library name is an API contract, and that to change it you would need a new name, then that emphasises careful API design up front and doing your best to honour the API when |
| 05:45:39 | → | deadmarshal joins (~deadmarsh@95.38.113.80) |
| 05:45:40 | <chronon> | updating things. |
| 05:46:27 | <c_wraith> | it's not like old libraries expire |
| 05:46:46 | <dsal> | heh, I've rarely seen anyone get anything right before deploying. |
| 05:47:27 | <chronon> | Sure the implementation is rarely correct first time, but the basic API is something you can plan and then stick to (usually). |
| 05:47:36 | <dsal> | The conversation came from "how do you specify which libraries you want" (which includes which versions). If "always use the latest version" is enabled, then every time you run the script, you might be running different code, which seems bad. |
| 05:48:05 | <chronon> | Yes, but that is bad if you presume people will keep making breaking changes. |
| 05:48:36 | <chronon> | If your culture says never make breaking changes, then assuming the latest version is fine will work. |
| 05:48:49 | <dsal> | Your idea of "basic API" sounds super handwavy. I changed a type from a type alias to a newtype in a release. The API docs read mostly the same, but it caused compilation issues for users. |
| 05:49:05 | <chronon> | I think this is purely a cultural issue, not a technical one. |
| 05:49:27 | <c_wraith> | It's not a cultural issue that most people get APIs wrong on the first try |
| 05:49:50 | <c_wraith> | that's just a failure to predict the future |
| 05:50:16 | <c_wraith> | You seem to be advocating for only making libraries after you know everything |
| 05:50:21 | <c_wraith> | Which seems awfully late to start |
| 05:50:38 | <chronon> | Maybe Haskell makes it harder than other languages to abstract type details away from the users of an API. |
| 05:50:41 | → | merijn joins (~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) |
| 05:50:57 | <dsal> | I have no experience in any language that matches your description. |
| 05:51:11 | <chronon> | I cannot tell yet because I'm still learning it. Probably best for me to shut up for now. :-) |
| 05:52:04 | <c_wraith> | I think lens is an incredibly illustrative example. Those early versions changed tons of things because nobody knew how to make it work yet. |
| 05:52:17 | <c_wraith> | Until someone actually makes the thing, you just have no idea |
| 05:52:18 | → | alx741 joins (~alx741@181.199.42.143) |
| 05:52:39 | <c_wraith> | And then until 100 other people run into problems, all you have is a guess |
| 05:53:11 | <dsal> | What would lens be called if it had to be renamed every time there was a breaking change? |
| 05:53:23 | <chronon> | lens45 ? |
| 05:53:57 | <dsal> | Why would you put numbers at the end when there's already a version number? |
| 05:54:02 | <chronon> | Or maybe with a culture that leans towards not making so many breaking changes, it might only be called lens2 |
| 05:54:05 | <c_wraith> | so really, all you're advocating for is making the version number part of the package name? What does that change? |
| 05:55:42 | <chronon> | Yes, that's exatcly my point, name or major version number is essentially the same thing, it defines the API contract we are using. The differrence is that Haskell versioning seems to favour regular breaking changes, whereas most other languages aim not to have breaking changes in the first place. It's a cultural issue. |
| 05:56:07 | <chronon> | Anyway, no point in me discussing this any further at the moment, I need to press on with the tutorial. |
| 05:56:31 | <c_wraith> | I assure you, in my 20 year professional career, exactly 0 languages have lacked constant breaking changes to library |
| 05:57:06 | <dsal> | The only libraries that don't change are also not getting bug fixes. |
| 05:58:32 | <chronon> | I'm curious about a line like: qsort (x:xs) = qsort before ++ [x] ++ qsort after |
| 05:59:14 | <chronon> | How does haskell know that the first qsort does not apply to the result of the whole of the rest of the line? When are brackets needed? |
| 05:59:37 | <dsal> | function calls bind very tightly. |
| 05:59:44 | <ski> | function application binds tighter than infix operators |
| 05:59:46 | × | zebrag quits (~chris@user/zebrag) (Quit: Konversation terminated!) |
| 05:59:55 | <ski> | (higher precedence) |
| 06:00:05 | <dsal> | But any given operator can have different binding strength (that the author gets to decide). |
| 06:00:06 | <chronon> | Ok, I seee. Is tere a precendence table I can look up somewhere? |
| 06:00:15 | <dsal> | % :i (++) |
| 06:00:16 | <yahb> | dsal: (++) :: forall a. [a] -> [a] -> [a] -- Defined in `GHC.Base'; infixr 5 ++ |
| 06:00:39 | <dsal> | % :i ($) |
| 06:00:39 | <yahb> | dsal: ($) :: forall a b. (a -> b) -> a -> b -- Defined in `GHC.Base'; infixr 0 $ |
| 06:00:41 | <ski> | function application is left-associative, with precedence level `10' |
| 06:00:42 | <dsal> | % :i (.) |
| 06:00:42 | <yahb> | dsal: (.) :: forall b c a. (b -> c) -> (a -> b) -> a -> c -- Defined in `GHC.Base'; infixr 9 . |
| 06:00:57 | <c_wraith> | sure. operators: anywhere from 0 to 9. the operator definition can specify. Function application: 10. Record update: 11 |
| 06:01:51 | <ski> | (`@',`~',`!' (and record construction) in patterns also have higher precedence than application) |
| 06:02:11 | <dsal> | The neat thing about that is that the language itself doesn't have to have an opinion on + or * precedence. That's a library concern. |
| 06:03:05 | <chronon> | Neat, or scary, I guess is depends on context. :-) |
| 06:03:05 | × | alx741 quits (~alx741@181.199.42.143) (Read error: Connection reset by peer) |
| 06:03:47 | → | alx741 joins (~alx741@181.199.42.143) |
| 06:05:03 | → | takuan joins (~takuan@178-116-218-225.access.telenet.be) |
| 06:05:07 | <dsal> | It does mean if you see `some stuff $$$$ other stuff` you know what's happening. But if you see `a $$ b $$$ c` you might need to look things up. |
| 06:05:38 | <chronon> | And what is the usual way to look up things like that? |
| 06:05:51 | <dsal> | % :i (<$>) |
| 06:05:51 | <yahb> | dsal: (<$>) :: forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b -- Defined in `Data.Functor'; infixl 4 <$> |
| 06:06:46 | → | k8yun joins (~k8yun@user/k8yun) |
| 06:06:52 | <mshiraeeshi> | chronon: why are you learning haskell? |
| 06:06:55 | <dsal> | A lot of times, you can't really write terribly ambiguous things without the compiler getting mad at you. |
| 06:08:02 | <chronon> | Why am I learning Haskell? That's an odd question in a haskell group. Because I believe it will be a powerful and useful language, and expand my mind along the way? Is that a good enough answer? |
| 06:08:29 | × | alx741 quits (~alx741@181.199.42.143) (Read error: Connection reset by peer) |
| 06:08:38 | <mshiraeeshi> | I mean, do you have a specific purpose or just for fun |
| 06:08:55 | <mshiraeeshi> | seems like you're learning it for fun |
| 06:09:42 | <chronon> | Well, if it turns out to be as useful as I am hoping then I will likely use it for day to day tasks, and if I really enjoy it I might hope to get work using it. Yes, for fun, but hopefully not only for fun. |
| 06:10:25 | <mshiraeeshi> | I noticed that some languages tend to gravitate towards some niche |
| 06:10:43 | <mshiraeeshi> | for scala it is big data analysis |
| 06:11:13 | <chronon> | I am someone who likes correctness in software. I care about correctness more than most of my colleagues. I believe that haskell is a language that will make it possible to have a higher degree of confidence in the correctness of my code. |
| 06:11:31 | <mshiraeeshi> | for haskell it is blockchain I think |
| 06:11:42 | <dsal> | oh no. Please no. |
| 06:11:54 | <davean> | mshiraeeshi: Ugh |
| 06:12:09 | <mshiraeeshi> | it is weird that you have a whole language and you have to use it in some narrow field |
| 06:12:16 | <mshiraeeshi> | only |
| 06:12:41 | <mshiraeeshi> | anyway, that's the impression I got |
| 06:12:50 | <dsal> | None of my haskell code interacts with any blockchains. |
| 06:13:01 | <dsal> | (as far as I know) |
| 06:13:21 | <davean> | The only "block chain" my code interacts with is a merkle tree of SSL certificates |
| 06:13:30 | <mshiraeeshi> | dsal: what are your projects about? I mean, they are web applications? |
| 06:13:32 | <chronon> | I had not seen any suggestion of haskell and blockchain being correlated. But perhaps blockchain people care enough about correctness to pick a language where correctness is a thing. |
| 06:14:49 | <dsal> | mshiraeeshi: I have a lot of iot stuff, data processing stuff, etc... |
| 06:15:10 | <dsal> | mshiraeeshi: Currently, my computer is doing this stuff: https://dustin.sallings.org/2020/04/29/gopro-plus.html |
| 06:19:32 | × | merijn quits (~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) (Ping timeout: 256 seconds) |
| 06:20:03 | <chronon> | What's the comment charater? It doesn't like # (except on the shebang line). |
| 06:20:34 | × | k8yun quits (~k8yun@user/k8yun) (Quit: Leaving) |
| 06:20:41 | <mshiraeeshi> | it's -- |
| 06:22:04 | <chronon> | Like SQL. Thanks. |
| 06:22:45 | <mshiraeeshi> | so what do you think is the solution to the "niche language" situation? |
| 06:23:11 | <mshiraeeshi> | avoiding putting all the eggs in one basket and gaining expertise in several languages? |
| 06:23:49 | <dsal> | What niche language situation? |
| 06:24:25 | <mshiraeeshi> | earlier I wrote: |
| 06:24:25 | <mshiraeeshi> | I noticed that some languages tend to gravitate towards some niche |
| 06:24:41 | <mshiraeeshi> | for scala it is big data analysis |
| 06:25:05 | <dsal> | Well yes, but you also thought haskell is a blockchain language. Perhaps just learn more about what people are doing with things? |
| 06:25:05 | → | alx741 joins (~alx741@181.199.42.143) |
| 06:25:29 | × | bontaq quits (~user@ool-45779fe5.dyn.optonline.net) (Ping timeout: 256 seconds) |
| 06:25:32 | <chronon> | I don't think languages gravitate to a niche. It's that people working in a niche gravitate towards the most suitable language. Sharing a common language is the driver for this. |
| 06:25:40 | <dsal> | Haskell is my go-to language for just about anything I need to get done (exceptions being things that require other languages). |
| 06:26:49 | <mshiraeeshi> | dsal: "Perhaps just learn more about what people are doing with things?" |
| 06:27:08 | <mshiraeeshi> | how? |
| 06:27:32 | <dsal> | Instead of saying things like, "hey, I hear you all are scammers" maybe ask what people are working on. :) |
| 06:27:58 | <mshiraeeshi> | I check haskell subreddit, I see hobby pet projects, abstract libraries |
| 06:28:00 | <dsal> | It's possible someone in here works on some blockchains, but it only comes up WRT, like, one company. |
| 06:28:05 | × | Midjak quits (~Midjak@82.66.147.146) (Quit: This computer has gone to sleep) |
| 06:28:19 | <davean> | mshiraeeshi: those abstract libraries are for work |
| 06:28:56 | <mshiraeeshi> | also vacancies - that's what describes actual work that gets done, right? |
| 06:29:27 | <mshiraeeshi> | and oftentimes there is blockchain involved in the job description |
| 06:29:39 | <dsal> | "works" is a strange abstraction. I don't know the relevance. |
| 06:29:48 | <chronon> | buzzwords sell jobs. |
| 06:30:17 | <monochrom> | The niche language problem seems to be an XY problem. The true problem seems to be: you can't simultaneously choose both what job offers to accept and what language to use in that job. |
| 06:31:33 | <dsal> | I rely on Haskell to monitor my car and run my air conditioner and measure my consumption and freezer temperatures and manage my video and other large media management. But also I get paid for writing haskell. The last part isn't as interesting as the others to me. :) |
| 06:32:01 | <monochrom> | Well, what's new. Even before programming existed in the first place, you can't simultaneously choose both which jobs offer to accept and which place to live in. |
| 06:32:34 | → | lavaman joins (~lavaman@98.38.249.169) |
| 06:33:06 | <monochrom> | I bet people back then talked about the niche town problem, like "Detroit is for cars, Washington D.C. is for civil service". |
| 06:33:36 | <chronon> | If there are two functions f and g, then when I write f g x would that naturally parse as f(g(x)) or do I necessarily need brackets? |
| 06:34:04 | <Maxdamantus> | (f g) x |
| 06:34:53 | <Maxdamantus> | So yes, if you want it to mean `f(g(x))`, you need brackets, though not that many. `f (g x)` will suffice. |
| 06:34:53 | × | alx741 quits (~alx741@181.199.42.143) (Read error: Connection reset by peer) |
| 06:35:33 | → | alx741 joins (~alx741@157.100.197.240) |
| 06:35:49 | <Maxdamantus> | alternatively you can use the `($)` application operator which has lower precedence than the built-in call syntax, `f $ g x` |
| 06:35:55 | <chronon> | I see, yes, just verified this manually. Hmm, it seems odd that it would choose the wrong interpretation when contextually it seems clear that (f g) x is not a valid parsing. |
| 06:35:57 | <ski> | <ski> function application is left-associative, with precedence level `10' |
| 06:35:57 | <dsal> | chronon: you can pass g as an argument to f |
| 06:36:34 | <dsal> | `(f g) x` is the valid parsing. |
| 06:36:34 | <ski> | the "left-associative" bit means that `f g x' gets parsed as `(f g) x', just like `7 - 2 - 3' gets parsed as `(7 - 2) - 3' |
| 06:37:03 | <monochrom> | When you later learn higher order functions such as "map cos [1,2,3]" you will appreciate that the computer does not think "map (cos [1,2,3])". |
| 06:37:04 | <ski> | if you want `f (g x)' or `7 - (2 - 3)', you'll have to be explicit about those brackets |
| 06:37:06 | × | lavaman quits (~lavaman@98.38.249.169) (Ping timeout: 256 seconds) |
| 06:37:41 | <chronon> | I suppose my question is why did they decide function application should be left associative? |
| 06:37:46 | <dsal> | chronon: It's worth noting that functions take one argument and return one value. |
| 06:38:04 | → | yauhsien_ joins (~yauhsien@61-231-37-106.dynamic-ip.hinet.net) |
| 06:38:10 | <Maxdamantus> | chronon: because of "curried" functions. |
| 06:38:23 | <ski> | `map cos [1,2,3]' means `(map cos) [1,2,3]', which is the valid (and intended) parsing here, yes |
| 06:38:42 | <Maxdamantus> | > let sum = foldl (+) 0 in sum [1, 2, 3] |
| 06:38:43 | <lambdabot> | 6 |
| 06:38:52 | <chronon> | Hmm, ok, looks like the answer is because I don't know enough yet. I will suspend my curiocity and read on in the tutorial. |
| 06:39:30 | <ski> | > map (map (^ 2)) [[],[0],[1,2],[3,4,5],[6,7,8,9]] -- this would be more awkward, without `map' being expressed in curried style |
| 06:39:32 | <lambdabot> | [[],[0],[1,4],[9,16,25],[36,49,64,81]] |
| 06:39:54 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 06:40:01 | <ski> | > map (\xs -> map (^ 2) xs) [[],[0],[1,2],[3,4,5],[6,7,8,9]] -- this is basically what you'd have to do, if you couldn't partially apply `map' |
| 06:40:03 | <lambdabot> | [[],[0],[1,4],[9,16,25],[36,49,64,81]] |
| 06:40:52 | <Maxdamantus> | Functions all take exactly one argument, so if you see something like `f x y z`, it means `((f x) y) z`, so you can always just omit the "last arguments" and apply them later. |
| 06:41:13 | <dsal> | Or, often more interestingly, reuse them. |
| 06:41:18 | <Maxdamantus> | by doing `let g = f x y in g z` |
| 06:41:23 | <ski> | > filter (all odd) [[0,2,6],[1,7],[3,4,8],[5,9]] -- another partial application example |
| 06:41:25 | <lambdabot> | [[1,7],[5,9]] |
| 06:41:36 | <dsal> | > map (mod 2) [1..9] |
| 06:41:37 | <lambdabot> | [0,0,2,2,2,2,2,2,2] |
| 06:42:03 | <dsal> | mod is probably a bad example since nobody writes it that way. heh |
| 06:42:20 | <ski> | > map (`mod` 3) [1..9] |
| 06:42:22 | <lambdabot> | [1,2,0,1,2,0,1,2,0] |
| 06:42:25 | <monochrom> | I sometimes write it that way. :) |
| 06:42:33 | <monochrom> | mod 5 2 and div 5 2. |
| 06:42:34 | Maxdamantus | thinks he prefers his `sum` example. |
| 06:42:56 | <monochrom> | too lazy to reach the ` key... :) |
| 06:43:18 | <ski> | % :i elem |
| 06:43:18 | <yahb> | ski: type Foldable :: (* -> *) -> Constraint; class Foldable t where; ...; elem :: forall a. Eq a => a -> t a -> Bool; ...; -- Defined in `Data.Foldable'; infix 4 `elem` |
| 06:43:20 | × | yauhsien_ quits (~yauhsien@61-231-37-106.dynamic-ip.hinet.net) (Ping timeout: 256 seconds) |
| 06:44:31 | <ski> | > filter (1 `elem`) [[0,2,4,6],[1,3,5,7],[1,5],[3,7],[1],[5],[3],[7]] |
| 06:44:32 | <lambdabot> | [[1,3,5,7],[1,5],[1]] |
| 06:45:13 | <EvanR> | :t `($)` |
| 06:45:14 | <lambdabot> | error: parse error on input ‘`’ |
| 06:45:26 | <EvanR> | fiddlesticks |
| 06:46:05 | ski | would prefer `$' not being mentioned early in tutorials |
| 06:50:27 | × | Vajb quits (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer) |
| 06:51:12 | → | Vajb joins (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) |
| 06:55:00 | <chronon> | Does the "standard prelude" exist as a file I can read in source form? |
| 06:56:12 | <chronon> | If so, which filename do I need to look for? |
| 06:57:44 | <dsal> | that's not exactly how it works. A module can export symbols from other modules. |
| 06:58:04 | → | alx741 joins (~alx741@157.100.197.240) |
| 06:58:08 | <dsal> | You can read the docs for at least some version here: https://hackage.haskell.org/package/base-4.16.0.0/docs/Prelude.html |
| 06:58:31 | <dsal> | The source links seem broken there, though. That's unfortunate. |
| 06:58:36 | × | Erutuon quits (~Erutuon@user/erutuon) (Ping timeout: 240 seconds) |
| 06:58:38 | → | coot joins (~coot@213.134.190.95) |
| 06:58:51 | → | mbuf joins (~Shakthi@223.184.49.187) |
| 06:58:57 | × | little_mac quits (~little_ma@2601:410:4300:3ce0:24a8:40ee:fe3d:56e6) (Ping timeout: 240 seconds) |
| 06:59:09 | <dsal> | Some of them work, at leaset. |
| 07:01:01 | <ski> | source link (to <https://hackage.haskell.org/package/base-4.16.0.0/docs/src/Prelude.html>) works here |
| 07:01:02 | <chronon> | Ok, thanks. |
| 07:01:41 | <ski> | (of course, that just, for GHC, reexports a bunch of other modules) |
| 07:01:45 | → | Erutuon joins (~Erutuon@user/erutuon) |
| 07:02:35 | <chronon> | Oh look: import System.IO there's no version number on that import statement. That's not what I was expecting to see given the earlier conversation. |
| 07:03:30 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 07:04:21 | chronon | regrets bring that up again. |
| 07:04:27 | <dsal> | The point of that conversation is that there's no version number. |
| 07:05:02 | <dsal> | `System.IO` isn't a package. |
| 07:05:53 | <dsal> | But it's part of a versioned package and when you write software that depends on a package and you just hope it works after each new software update, you eventually get sad. That's why we don't do that. |
| 07:07:05 | <dsal> | The early days of go were like that. It was pretty exciting. There were several inventions people came up with to try to figure out how have predictable builds. There are only about two or so in use now that they've made a new standard after everyone else solved it. |
| 07:09:20 | <dsal> | I can't remember how many ways python ended up with. I just know I ended up with a lot of broken python scripts and basically assume if someone has a python script on the internet, I won't be able to make it run on my computer. |
| 07:12:18 | <chronon> | The python people have a virtual environment system. I never got into using that. It seem like a symptom of a bigger failing in the ecosystem. |
| 07:12:30 | ski | . o O ( "A Ban on Imports" by Gilad Bracha in 2009-06-30 at <https://gbracha.blogspot.com/2009/06/ban-on-imports.html> ) |
| 07:12:37 | × | kjak quits (~kjak@pool-108-45-56-21.washdc.fios.verizon.net) (Ping timeout: 240 seconds) |
| 07:18:33 | × | tzh quits (~tzh@c-24-21-73-154.hsd1.or.comcast.net) (Quit: zzz) |
| 07:21:30 | → | alx741 joins (~alx741@157.100.197.240) |
| 07:26:08 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 07:28:38 | <chronon> | That blog is a wonderfully humorous read. Some people really have a gift for writing. |
| 07:28:52 | <chronon> | But it's a distraction. Stop it. ;-) |
| 07:29:30 | <dsal> | Yes, some projects use virtualenv. Those *sometimes* work as they do list many of the things you need to get started. But what if I don't have a C library they're linking against? Or the C library I have is the wrong version? That's typically where those stop working for me. |
| 07:30:11 | <dsal> | Nowadays, if it ships as a docker image, it might work, but now I'm installing another operating system just to run a python script. Hardly seems better than just compiling a program. |
| 07:30:21 | dsal | still has to figure out how to make a docker image for one of his projects since someone asked |
| 07:32:08 | <EvanR> | hey man you can't beat the reliability of driving a van containing a working PC with the desired software already installed and working to your house |
| 07:32:49 | <EvanR> | latency is an issue but whatevs |
| 07:34:46 | <dsal> | So much bandwidth. |
| 07:42:13 | → | gehmehgeh joins (~user@user/gehmehgeh) |
| 07:43:04 | <systemfault> | Hi, I was wondering was is the "best" way to install ghc on my mac, I could probably do it via brew... but then there's also the "stack" route... but now there's also something called ghcup that can be used to install ghc + cabal or stack... etc.. |
| 07:43:48 | <sclv> | ghcup is the best way |
| 07:44:02 | → | alx741 joins (~alx741@157.100.197.240) |
| 07:44:05 | <sclv> | it is standard and recommended |
| 07:44:57 | × | notzmv quits (~zmv@user/notzmv) (Ping timeout: 240 seconds) |
| 07:46:39 | <systemfault> | And if I dare asking cabal vs stack, am I going to start a war? I heard that stack used to be the way to go for painless dependency management but that nowadays cabal has caught up or something |
| 07:47:23 | × | mbuf quits (~Shakthi@223.184.49.187) (Quit: Leaving) |
| 07:47:52 | <systemfault> | ghcup is good stuff 👍 |
| 07:48:49 | <sclv> | right. nowadays both work fine and of the two |
| 07:48:49 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 07:49:00 | <sclv> | cabal is more actively developed. |
| 07:49:17 | <dsal> | I've not successfully built a project without stack, but I've worked on them, so it's possible. |
| 07:49:25 | <sclv> | and makes it more convenient to use a broader range of packages. |
| 07:50:49 | → | wonko_ joins (~wjc@2a0e:1c80:11::50) |
| 07:51:14 | <systemfault> | Fair enough, I'll start with Cabal since it's the "blessed" package manager |
| 07:51:18 | <dsal> | Last time I tried ghcup it wasn't working on my Mac. I use nix for all that stuff. It's precarious |
| 07:51:52 | <dsal> | stack uses cabal, so you'll user cabal either way. :) |
| 07:52:07 | <systemfault> | I haven't had good experiences with nix on mac... there was like no binaries and it had to compile the whole world |
| 07:52:18 | <systemfault> | But Nix on NixOS is pretty good stuff |
| 07:52:27 | × | dolio quits (~dolio@130.44.130.54) (Remote host closed the connection) |
| 07:52:42 | → | dolio joins (~dolio@130.44.130.54) |
| 07:52:43 | → | irishman joins (~vshev4enk@178.151.117.243) |
| 07:52:50 | <dsal> | I've not had that particular problem in a bit, but yeah, I've had it. |
| 07:53:34 | <dsal> | I had it worse on nixos recently since we it a patched version of ghc and I didn't have my cache configured. |
| 07:53:38 | × | wonko_ quits (~wjc@2a0e:1c80:11::50) (Client Quit) |
| 07:53:46 | → | max22- joins (~maxime@2a01cb0883359800bbcc7fa8d7db61b8.ipv6.abo.wanadoo.fr) |
| 07:54:35 | × | [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Read error: Connection reset by peer) |
| 07:54:59 | <jackdk> | systemfault: the trick is to make sure your nixpkgs pin is drawn from a darwin channel |
| 07:55:07 | <ski> | systemfault : "The Cabal/Stack Disambiguation Guide" <https://gist.github.com/merijn/8152d561fb8b011f9313c48d876ceb07> |
| 07:56:07 | <systemfault> | jackdk: I'll stay with ghcup for now, it was really quick to install ghc + latest cabal. But I may revisit nix on osx eventually |
| 07:56:19 | <systemfault> | jackdk: Thanks for the info though, really helpful |
| 07:56:28 | × | mon_aaraj quits (~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 250 seconds) |
| 07:57:16 | <dsal> | ghcup installed fast for me, but doesn't build anything. :) That might just be arm, though. |
| 07:57:17 | × | irishman quits (~vshev4enk@178.151.117.243) (Ping timeout: 256 seconds) |
| 07:57:33 | <dsal> | I've not tried in a month or so. |
| 07:58:15 | <systemfault> | I just want the less friction possible with tooling so I can focus on learning and writing code |
| 07:59:09 | × | turlando quits (~turlando@user/turlando) (Ping timeout: 272 seconds) |
| 07:59:10 | → | zeenk joins (~zeenk@2a02:2f04:a30d:1300:51a3:bcfc:6cda:9fc5) |
| 08:00:10 | <dsal> | Yep, makes sense. I try to get projects off of stack now and then and fail. It seems like it'd be easy, but I always run into something. I work by inertia |
| 08:00:12 | → | shiraeeshi joins (~shiraeesh@109.166.56.8) |
| 08:00:47 | × | shiraeeshi quits (~shiraeesh@109.166.56.8) (Read error: Connection reset by peer) |
| 08:01:39 | <jackdk> | systemfault: good luck. to be precise I mean something like nixpkgs-21.11-darwin |
| 08:01:41 | × | mshiraeeshi quits (~shiraeesh@109.166.56.8) (Ping timeout: 272 seconds) |
| 08:01:53 | → | shiraeeshi joins (~shiraeesh@109.166.56.8) |
| 08:02:08 | <systemfault> | I've been interested in Haskell for a long time now... but I never really built anything real world using it, and I would like to change that. The closest thing to pure FP I've done in the real-world is to using effect-ts with TypeScript. (Shame on me...) |
| 08:02:47 | × | shiraeeshi quits (~shiraeesh@109.166.56.8) (Read error: Connection reset by peer) |
| 08:04:58 | → | alx741 joins (~alx741@157.100.197.240) |
| 08:08:28 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 08:16:37 | → | lavaman joins (~lavaman@98.38.249.169) |
| 08:18:09 | → | wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com) |
| 08:18:09 | × | wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
| 08:18:09 | → | wroathe joins (~wroathe@user/wroathe) |
| 08:19:54 | → | acidjnk_new joins (~acidjnk@p200300d0c71a5a00a926c52c5a33de35.dip0.t-ipconnect.de) |
| 08:20:02 | → | turlando joins (~turlando@93-42-250-112.ip89.fastwebnet.it) |
| 08:20:02 | × | turlando quits (~turlando@93-42-250-112.ip89.fastwebnet.it) (Changing host) |
| 08:20:02 | → | turlando joins (~turlando@user/turlando) |
| 08:20:52 | × | turlando quits (~turlando@user/turlando) (Client Quit) |
| 08:21:19 | → | turlando joins (~turlando@93-42-250-112.ip89.fastwebnet.it) |
| 08:21:19 | × | turlando quits (~turlando@93-42-250-112.ip89.fastwebnet.it) (Changing host) |
| 08:21:19 | → | turlando joins (~turlando@user/turlando) |
| 08:23:00 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 240 seconds) |
| 08:23:23 | × | jpds quits (~jpds@gateway/tor-sasl/jpds) (Remote host closed the connection) |
| 08:23:48 | → | jpds joins (~jpds@gateway/tor-sasl/jpds) |
| 08:26:21 | → | alx741 joins (~alx741@157.100.197.240) |
| 08:27:53 | × | turlando quits (~turlando@user/turlando) (Ping timeout: 256 seconds) |
| 08:33:30 | × | acidjnk_new quits (~acidjnk@p200300d0c71a5a00a926c52c5a33de35.dip0.t-ipconnect.de) (Ping timeout: 260 seconds) |
| 08:34:07 | ← | jakalx parts (~jakalx@base.jakalx.net) () |
| 08:34:12 | × | pooryorick quits (~pooryoric@87-119-174-173.tll.elisa.ee) (Ping timeout: 240 seconds) |
| 08:37:38 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 08:41:02 | → | alp joins (~alp@user/alp) |
| 08:47:24 | → | jakalx joins (~jakalx@base.jakalx.net) |
| 08:48:55 | → | wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com) |
| 08:48:55 | × | wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
| 08:48:55 | → | wroathe joins (~wroathe@user/wroathe) |
| 08:51:13 | → | polezaivsani joins (~polezaivs@orangeshoelaces.net) |
| 08:52:31 | × | eggplantade quits (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) (Remote host closed the connection) |
| 08:52:39 | → | jtomas joins (~jtomas@210.red-88-24-179.staticip.rima-tde.net) |
| 08:53:57 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 256 seconds) |
| 08:55:56 | → | alx741 joins (~alx741@157.100.197.240) |
| 08:57:25 | <dminuoso> | dsal: Heh, and I have not successfully built a project *with* stack yet. |
| 08:59:54 | → | turlando joins (~turlando@93-42-250-112.ip89.fastwebnet.it) |
| 08:59:54 | × | turlando quits (~turlando@93-42-250-112.ip89.fastwebnet.it) (Changing host) |
| 08:59:54 | → | turlando joins (~turlando@user/turlando) |
| 08:59:56 | → | kuribas joins (~user@ptr-25vy0i8y9oiry1fm4yq.18120a2.ip6.access.telenet.be) |
| 09:00:06 | × | thejuan24f[m] quits (~thejuan2m@2001:470:69fc:105::1:6569) (Quit: You have been kicked for being idle) |
| 09:00:11 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 09:00:16 | × | afotgkmnzj7asv3r quits (~afotgkmnz@2001:470:69fc:105::c24b) (Quit: You have been kicked for being idle) |
| 09:00:16 | × | throwaaaa[m] quits (~throwaaaa@2001:470:69fc:105::1:6fe6) (Quit: You have been kicked for being idle) |
| 09:00:43 | → | merijn joins (~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) |
| 09:05:34 | × | gehmehgeh quits (~user@user/gehmehgeh) (Quit: Leaving) |
| 09:06:50 | × | coot quits (~coot@213.134.190.95) (Quit: coot) |
| 09:09:00 | → | mon_aaraj joins (~MonAaraj@user/mon-aaraj/x-4416475) |
| 09:11:54 | <kuribas> | Should you version control your configuration? |
| 09:12:26 | <kuribas> | What about sensitive info, like database passwords? |
| 09:12:48 | → | waleee joins (~waleee@h-98-128-229-110.NA.cust.bahnhof.se) |
| 09:14:22 | → | lottaquestions_ joins (~nick@2607:fa49:5041:a200:b668:8e8:f292:8d7c) |
| 09:15:09 | × | dyeplexer quits (~dyeplexer@user/dyeplexer) (Ping timeout: 272 seconds) |
| 09:16:20 | <dminuoso> | kuribas: So what we started to do is use GPG on every server. The server receives a master key, and we then encrypt credentials against the master public key. |
| 09:16:49 | <dminuoso> | So that way we have a repository for each fleet of servers that contains their full specification |
| 09:16:52 | → | alx741 joins (~alx741@157.100.197.240) |
| 09:17:35 | <dminuoso> | It requires a bit of systemd unit machinery to decrypt these, and sometimes a bit of templating or replacemnet shenanigans for when a given software doesnt have a way to include another file, or have some passwordFile option |
| 09:18:50 | <kuribas> | So you encrypt passwords in the configuration files? |
| 09:18:56 | <dminuoso> | So we dont just version control configuration, we version control the entire server. |
| 09:19:00 | × | lavaman quits (~lavaman@98.38.249.169) (Ping timeout: 240 seconds) |
| 09:19:15 | <kuribas> | and what do you encrypt? |
| 09:19:30 | <dminuoso> | Mmm, hold on let find something that I can share with you |
| 09:19:43 | → | wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com) |
| 09:19:43 | × | wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
| 09:19:43 | → | wroathe joins (~wroathe@user/wroathe) |
| 09:20:11 | <kuribas> | "whole server" <= like a nix configuration? |
| 09:20:19 | <kuribas> | or ansible? |
| 09:20:19 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 09:20:36 | <dminuoso> | For us its a nixos configuration, but you can do this with whatever tool you use. |
| 09:20:48 | <kuribas> | well, don't use any... |
| 09:20:50 | <dminuoso> | There's really no other way if you want to be able to automatically recover any server. |
| 09:20:53 | → | Tuplanolla joins (~Tuplanoll@91-159-69-98.elisa-laajakaista.fi) |
| 09:21:00 | <kuribas> | we just copy the binary to the production server. |
| 09:21:08 | <dminuoso> | Plus, you always have a declarative specification of your server. :) |
| 09:21:15 | <kuribas> | yeah, that's nice. |
| 09:21:45 | <dminuoso> | Over time you accumulate admins managing iptables, configuring the network, installing packages, editing files, setting kernel config, manipulating systemd units.. |
| 09:21:51 | <kuribas> | We want to go more towards ansible and reproducability, but it is a long term project, like months... |
| 09:22:06 | <dminuoso> | And quickly you reach to the point where you *have* to snapshot entire VMs, but nobody can tell you how its configured... |
| 09:22:32 | <dminuoso> | And when you have a hardware machine, you're pretty much out of luck. |
| 09:22:42 | <dminuoso> | But anyway |
| 09:22:51 | <dminuoso> | Irrespective of how much you store, the general idea is still applicable |
| 09:23:51 | <kuribas> | dminuoso: So what do you encrypt then? |
| 09:24:05 | <dminuoso> | kuribas: Operationally what we do is this: We use `git-secrets` to do multi key encryption, and the ring of keys to encrypt all secrets for consists of: a) each administrator of the server, and b) the master key of the server itself. |
| 09:24:33 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 256 seconds) |
| 09:25:06 | <dminuoso> | Then, using that, we encrypt each secret/password (including the master private key) using git-secret against that "ring" |
| 09:25:45 | <dminuoso> | Each server has some initial bootstrapping, where it receives the master private key (so we type `git secret reveal`, copy over the master private key using `morph/nixos`, but you can do whatever here) |
| 09:26:35 | <dminuoso> | Then, we just use `git secret` to encrypt further secrets like database passwords. |
| 09:27:13 | <dminuoso> | So we can encrypt passwords such that the server can decrypt them |
| 09:27:21 | <dminuoso> | And keep the encrypted password in the repo |
| 09:27:59 | <dminuoso> | So then the server has a systemd unit running for each secret it must decrypt |
| 09:28:24 | <dminuoso> | With the correct systemd ordering and dependencies |
| 09:29:02 | <dminuoso> | (say if you have a password that your app `foo` needs to even start up, it would have `Before=foo.service; WantedBy=foo.service` |
| 09:29:06 | → | Guest73 joins (~Guest73@2a02:587:983d:7c00:d3f3:4e58:6ef2:5281) |
| 09:29:41 | → | dyeplexer joins (~dyeplexer@user/dyeplexer) |
| 09:30:09 | <dminuoso> | And then you might have another systemd unit that either does some minor templating (say replace some PASSWORD string in your config with the actual decrypted content, again with systemd ordering and dependencies), or sometimes software allows "include" macro processors, then you can just refer to the path you know the secret will be decrypted to |
| 09:30:43 | <dminuoso> | Or sometimes software can also just refer to a path like `passwordFile = /srv/secrets-decrypted/my-db-password` |
| 09:31:01 | <dminuoso> | It took us a bit of engineering to get there, such that all these units are automatically generated. |
| 09:31:05 | <dminuoso> | But it was well worth it |
| 09:32:12 | × | vglfr quits (~vglfr@coupling.penchant.volia.net) (Ping timeout: 240 seconds) |
| 09:32:17 | × | jtomas quits (~jtomas@210.red-88-24-179.staticip.rima-tde.net) (Ping timeout: 240 seconds) |
| 09:32:49 | → | vglfr joins (~vglfr@coupling.penchant.volia.net) |
| 09:32:53 | <kuribas> | yeah, it's the direction we want to go in, but it will be a lot of work. |
| 09:35:12 | <dminuoso> | If you want to use just ansible, perhaps ansible vault might be suitable for you |
| 09:35:23 | <kuribas> | right |
| 09:35:45 | <kuribas> | We're also short on infra people. |
| 09:35:50 | <dminuoso> | Our solution is quite elaborate to cope with the realities of nixos. :) |
| 09:36:09 | <kuribas> | nixos looks interesting, but no way they'll accept it in our company :) |
| 09:37:20 | <dminuoso> | heh there's not much acceptance here either |
| 09:37:25 | <dminuoso> | but we're short on infra people |
| 09:37:52 | × | dwt_ quits (~dwt_@c-98-198-103-176.hsd1.tx.comcast.net) (Ping timeout: 256 seconds) |
| 09:37:59 | <dminuoso> | So its a "if you need us to manage this, we must use the tools to reduce our burden and effort" |
| 09:38:17 | → | alx741 joins (~alx741@181.199.42.143) |
| 09:38:24 | × | chenqisu1 quits (~chenqisu1@183.217.200.249) (Remote host closed the connection) |
| 09:40:31 | <dminuoso> | But now here we are. ~20 nixos machins running our mail cluster, we're rebuilding our DNS infrastructure to nixos, rebuilding a thanos cluster with nixos, our customer authentication service is a fleet of nixos.. |
| 09:40:40 | <dminuoso> | We're like the borg. |
| 09:41:10 | <maerwald[m]> | Using nix to reduce effort sounds like using Haskell to reduce code denseness |
| 09:42:54 | × | alx741 quits (~alx741@181.199.42.143) (Read error: Connection reset by peer) |
| 09:43:32 | × | Guest73 quits (~Guest73@2a02:587:983d:7c00:d3f3:4e58:6ef2:5281) (Quit: Client closed) |
| 09:43:40 | <dminuoso> | maerwald[m]: when you're managing some 30 servers, then getting any coherence in terms of "how must all servers be equipped", how are the servers even configures (admins logging in and just modifying things?) is definitely a problem |
| 09:43:59 | <dminuoso> | Especially if we want to do other things than play sysadmin all day long |
| 09:44:20 | <dminuoso> | Im not saying its the only way, but we tried alternatives and nixos seems to be getting us what we need |
| 09:44:26 | <dminuoso> | so for us its working |
| 09:44:48 | → | wonko joins (~wjc@user/wonko) |
| 09:46:04 | → | dwt_ joins (~dwt_@c-98-198-103-176.hsd1.tx.comcast.net) |
| 09:47:24 | × | alp quits (~alp@user/alp) (Ping timeout: 240 seconds) |
| 09:48:36 | × | dyeplexer quits (~dyeplexer@user/dyeplexer) (Ping timeout: 240 seconds) |
| 09:49:46 | → | Null_A joins (~null_a@2601:645:8700:2290:890f:d3a0:aab0:f3f) |
| 09:49:48 | → | _ht joins (~quassel@231-169-21-31.ftth.glasoperator.nl) |
| 09:50:29 | → | wroathe joins (~wroathe@user/wroathe) |
| 09:51:47 | <kuribas> | maerwald[m]: haskell is great to reduce code denseness. |
| 09:51:58 | <kuribas> | not sure what point you want to make. |
| 09:52:54 | → | eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:b580:ab83:1b56:af3b) |
| 09:52:57 | → | fendor joins (~fendor@77.119.223.31.wireless.dyn.drei.com) |
| 09:53:15 | → | coot joins (~coot@213.134.190.95) |
| 09:54:17 | × | Null_A quits (~null_a@2601:645:8700:2290:890f:d3a0:aab0:f3f) (Ping timeout: 240 seconds) |
| 09:54:38 | <kuribas> | I find haskell even denser than lisps, despite the types. |
| 09:55:00 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 240 seconds) |
| 09:55:23 | <maerwald[m]> | I have no idea what you mean |
| 09:55:44 | → | notzmv joins (~zmv@user/notzmv) |
| 09:56:03 | × | chronon quits (~chronon@user/chronon) (Quit: leaving) |
| 09:56:13 | → | chronon joins (~chronon@user/chronon) |
| 09:56:22 | <ski> | ("dense" as in "concise"/"brief" ?) |
| 09:56:57 | × | eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b580:ab83:1b56:af3b) (Ping timeout: 240 seconds) |
| 09:57:47 | <maerwald[m]> | ski: depends. Dense as in: you can't be drunk while reading code, which works great with java |
| 09:59:39 | → | alx741 joins (~alx741@157.100.197.240) |
| 10:00:42 | <kuribas> | you shouldn't be drunk while reading code... |
| 10:01:03 | <maerwald[m]> | kuribas: why not |
| 10:01:05 | → | dyeplexer joins (~dyeplexer@user/dyeplexer) |
| 10:04:13 | × | merijn quits (~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) (Ping timeout: 256 seconds) |
| 10:04:13 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 10:05:23 | <kuribas> | being drunk is not a criterium I use for evaluation anything programming related. |
| 10:05:32 | <kuribas> | being tired perhaps. |
| 10:05:53 | <kuribas> | I'd prefer read haskell being tired over read java. |
| 10:06:15 | → | Ariakenom_ joins (~Ariakenom@2001:9b1:efe:9d00:c571:ed19:3ac0:c340) |
| 10:07:27 | <icrbow[m]> | Being drunk while hotfixing some python code at 2am was my pivotal moment for turning Haskell. The solution was... not. And there was no compiler to steady my hands. |
| 10:07:43 | × | coot quits (~coot@213.134.190.95) (Ping timeout: 272 seconds) |
| 10:07:45 | <maerwald[m]> | xD |
| 10:09:01 | <ski> | @quote is.ok.though |
| 10:09:01 | <lambdabot> | dons says: Coding drunk in Haskell is ok though, its like drinking on a passenger plane flight -- the stewards will prevent you from hurting anyone. However, coding drunk in C is just scary, DUI |
| 10:09:01 | <lambdabot> | territory, and should not be allowed. I hope linux kernel devs don't write code under the influence |
| 10:10:38 | <icrbow[m]> | I wonder if "Ballmer Peak" thing somehow related to Microsoft Research work on Haskell. |
| 10:11:43 | <davean> | |
| 10:11:58 | <maerwald[m]> | ski: reading and writing are two wildly different things though. Reading other people's code feels like going through the memoirs of a serial killer and trying to figure out when they lost it. |
| 10:12:34 | → | szkl joins (uid110435@id-110435.uxbridge.irccloud.com) |
| 10:13:58 | <maerwald[m]> | "Other people" here equates to yourself in two weeks xD |
| 10:14:30 | <maerwald[m]> | So don't worry, have a glass |
| 10:15:32 | <kuribas> | That's a scary comparison... |
| 10:16:22 | → | Ariakenom__ joins (~Ariakenom@h-82-196-111-63.NA.cust.bahnhof.se) |
| 10:17:19 | → | capo_greco joins (~textual@60-241-161-167.static.tpgi.com.au) |
| 10:20:20 | × | Ariakenom_ quits (~Ariakenom@2001:9b1:efe:9d00:c571:ed19:3ac0:c340) (Ping timeout: 250 seconds) |
| 10:21:31 | <[exa]> | icrbow[m]: I believe that Ballmer peak was evaluated using the traditional microsoft evaluation methods, such as the cumulative success of Mr Clippy |
| 10:22:12 | → | alx741 joins (~alx741@181.199.42.143) |
| 10:26:36 | × | dyeplexer quits (~dyeplexer@user/dyeplexer) (Ping timeout: 240 seconds) |
| 10:27:32 | <dminuoso> | maerwald[m]: But anyway, I can certainly see where you're coming from. In many cases simpler is better, and nix certainly complicated things a lot. |
| 10:27:49 | <dminuoso> | Nix has very shitty UX (the diagnostics are ususally horrid), has piss poor documentation at times.. |
| 10:29:09 | × | waleee quits (~waleee@h-98-128-229-110.NA.cust.bahnhof.se) (Ping timeout: 256 seconds) |
| 10:30:50 | × | alx741 quits (~alx741@181.199.42.143) (Read error: Connection reset by peer) |
| 10:34:12 | <maerwald[m]> | Would you trust nix to manage your postfix config via high level declarative config? ;) |
| 10:35:43 | → | wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com) |
| 10:35:43 | × | wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
| 10:35:43 | → | wroathe joins (~wroathe@user/wroathe) |
| 10:39:45 | → | dyeplexer joins (~dyeplexer@user/dyeplexer) |
| 10:40:29 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 256 seconds) |
| 10:40:49 | → | cosimone joins (~user@93-47-228-207.ip115.fastwebnet.it) |
| 10:40:55 | bonz060 | is now known as bonfacekilz |
| 10:42:48 | bonfacekilz | is now known as bonz060 |
| 10:45:55 | <[exa]> | maerwald[m]: I thought it's just me, but are the admins generally very touchy about postfix configs? :D |
| 10:46:58 | → | irishman joins (~vshev4enk@178.151.117.243) |
| 10:47:17 | × | dyeplexer quits (~dyeplexer@user/dyeplexer) (Ping timeout: 256 seconds) |
| 10:47:27 | → | alx741 joins (~alx741@181.199.42.143) |
| 10:49:37 | bonz060 | is now known as bonfacekilz |
| 10:49:40 | × | capo_greco quits (~textual@60-241-161-167.static.tpgi.com.au) (Quit: My MacBook Air has gone to sleep. ZZZzzz…) |
| 10:50:10 | × | alx741 quits (~alx741@181.199.42.143) (Read error: Connection reset by peer) |
| 10:50:24 | <maerwald[m]> | Not sure, but having configured postfix servers manually, I don't trust some random packager to get it right, especially across postfix versions |
| 10:50:55 | → | alx741 joins (~alx741@157.100.197.240) |
| 10:51:38 | <maerwald[m]> | That leaves us with replicating low level configs across machines, which isn't that hard if you control the environment |
| 10:52:03 | × | irishman quits (~vshev4enk@178.151.117.243) (Ping timeout: 272 seconds) |
| 10:52:04 | bonfacekilz | is now known as bonz060 |
| 10:52:22 | bonz060 | is now known as bonfacekilz |
| 10:53:09 | × | awpr quits (uid446117@id-446117.lymington.irccloud.com) (Quit: Connection closed for inactivity) |
| 10:53:39 | → | coot joins (~coot@213.134.190.95) |
| 10:55:07 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 10:57:36 | × | Sgeo quits (~Sgeo@user/sgeo) (Read error: Connection reset by peer) |
| 10:59:35 | → | dyeplexer joins (~dyeplexer@user/dyeplexer) |
| 11:01:09 | → | perrierjouet joins (~perrier-j@modemcable012.251-130-66.mc.videotron.ca) |
| 11:03:36 | → | capo_greco joins (~textual@60-241-161-167.static.tpgi.com.au) |
| 11:10:28 | → | mikoto-chan joins (~mikoto-ch@213.177.151.239) |
| 11:10:45 | × | chronon quits (~chronon@user/chronon) (Quit: leaving) |
| 11:10:54 | → | chronon joins (~chronon@user/chronon) |
| 11:11:07 | <mikoto-chan> | what was the category channel called again? |
| 11:11:20 | → | pooryorick joins (~pooryoric@87-119-174-173.tll.elisa.ee) |
| 11:12:24 | × | kmein quits (~weechat@user/kmein) (Quit: ciao kakao) |
| 11:12:44 | → | kmein joins (~weechat@user/kmein) |
| 11:13:23 | → | alx741 joins (~alx741@157.100.197.240) |
| 11:13:53 | × | zeenk quits (~zeenk@2a02:2f04:a30d:1300:51a3:bcfc:6cda:9fc5) (Quit: Konversation terminated!) |
| 11:14:00 | → | kritzefitz joins (~kritzefit@debian/kritzefitz) |
| 11:16:33 | → | lavaman joins (~lavaman@98.38.249.169) |
| 11:17:40 | → | fendor_ joins (~fendor@178.165.200.21.wireless.dyn.drei.com) |
| 11:19:48 | × | fendor quits (~fendor@77.119.223.31.wireless.dyn.drei.com) (Ping timeout: 240 seconds) |
| 11:21:00 | × | lavaman quits (~lavaman@98.38.249.169) (Ping timeout: 256 seconds) |
| 11:22:10 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 11:38:18 | × | kuribas quits (~user@ptr-25vy0i8y9oiry1fm4yq.18120a2.ip6.access.telenet.be) (Quit: ERC (IRC client for Emacs 26.3)) |
| 11:40:01 | → | alx741 joins (~alx741@181.199.42.143) |
| 11:42:45 | <capo_greco> | in the miso documentation, Nix seems to be more or less a pre-requisite? |
| 11:43:22 | <capo_greco> | Nix is a bit annoying to install on Big Sur |
| 11:43:22 | × | alx741 quits (~alx741@181.199.42.143) (Read error: Connection reset by peer) |
| 11:43:39 | <capo_greco> | I was wondering if people were using Miso without Nix |
| 11:46:34 | × | wonko quits (~wjc@user/wonko) (Ping timeout: 250 seconds) |
| 11:50:06 | → | Null_A joins (~null_a@2601:645:8700:2290:890f:d3a0:aab0:f3f) |
| 11:53:00 | × | Erutuon quits (~Erutuon@user/erutuon) (Ping timeout: 240 seconds) |
| 11:54:36 | × | Null_A quits (~null_a@2601:645:8700:2290:890f:d3a0:aab0:f3f) (Ping timeout: 240 seconds) |
| 11:54:57 | → | acidjnk joins (~acidjnk@p200300d0c733ea53d592f9418a369360.dip0.t-ipconnect.de) |
| 11:54:59 | → | eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:b580:ab83:1b56:af3b) |
| 11:56:40 | → | Hanicef joins (~gustaf@81-229-9-108-no92.tbcn.telia.com) |
| 11:57:26 | → | bontaq joins (~user@ool-45779fe5.dyn.optonline.net) |
| 11:59:17 | × | eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:b580:ab83:1b56:af3b) (Ping timeout: 240 seconds) |
| 12:00:16 | → | alx741 joins (~alx741@181.199.42.143) |
| 12:01:51 | × | acidjnk quits (~acidjnk@p200300d0c733ea53d592f9418a369360.dip0.t-ipconnect.de) (Ping timeout: 256 seconds) |
| 12:02:02 | <maerwald> | capo_greco: ghcjs without nix is generally almost impossible |
| 12:03:49 | × | alx741 quits (~alx741@181.199.42.143) (Read error: Connection reset by peer) |
| 12:03:53 | <capo_greco> | ah. ok nix it is |
| 12:08:25 | → | Null_A joins (~null_a@2601:645:8700:2290:890f:d3a0:aab0:f3f) |
| 12:12:57 | × | Null_A quits (~null_a@2601:645:8700:2290:890f:d3a0:aab0:f3f) (Ping timeout: 240 seconds) |
| 12:20:29 | → | alx741 joins (~alx741@157.100.197.240) |
| 12:22:11 | → | jao joins (~jao@68.235.43.84) |
| 12:23:58 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 12:32:45 | × | capo_greco quits (~textual@60-241-161-167.static.tpgi.com.au) (Quit: Textual IRC Client: www.textualapp.com) |
| 12:37:01 | → | alp joins (~alp@user/alp) |
| 12:40:33 | → | vysn joins (~vysn@user/vysn) |
| 12:41:54 | → | alx741 joins (~alx741@157.100.197.240) |
| 12:44:24 | × | coot quits (~coot@213.134.190.95) (Quit: coot) |
| 12:45:04 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 12:45:37 | × | dyeplexer quits (~dyeplexer@user/dyeplexer) (Ping timeout: 240 seconds) |
| 12:46:52 | Hash | is now known as stoned |
| 12:51:02 | stoned | is now known as Hash |
| 12:54:04 | × | econo quits (uid147250@user/econo) (Quit: Connection closed for inactivity) |
| 12:55:57 | → | eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:5928:8400:a51e:7799) |
| 13:00:17 | × | eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:5928:8400:a51e:7799) (Ping timeout: 240 seconds) |
| 13:00:38 | → | zer0bitz joins (~zer0bitz@2001:2003:f74d:b800:34e0:8b74:dd2c:1d62) |
| 13:00:40 | → | pretty_dumm_guy joins (trottel@gateway/vpn/protonvpn/prettydummguy/x-88029655) |
| 13:01:18 | → | capo_greco joins (~textual@60-241-161-167.static.tpgi.com.au) |
| 13:03:31 | → | alx741 joins (~alx741@157.100.197.240) |
| 13:10:54 | → | jtomas joins (~jtomas@210.red-88-24-179.staticip.rima-tde.net) |
| 13:11:15 | <capo_greco> | ok so I have installed nix according to this guide: https://duan.ca/2020/12/13/nix-on-macos-11-big-sur/ |
| 13:11:16 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 13:11:27 | <capo_greco> | but I am getting `fish: Unknown command: nix-shell` |
| 13:12:08 | × | szkl quits (uid110435@id-110435.uxbridge.irccloud.com) (Quit: Connection closed for inactivity) |
| 13:12:30 | <capo_greco> | I feel like I want to `fish_add_path` but I'm not sure where nix-shell lives |
| 13:12:45 | <capo_greco> | or if it even works that way |
| 13:13:02 | × | vysn quits (~vysn@user/vysn) (Ping timeout: 260 seconds) |
| 13:13:29 | × | Ariakenom__ quits (~Ariakenom@h-82-196-111-63.NA.cust.bahnhof.se) (Ping timeout: 256 seconds) |
| 13:13:29 | → | merijn joins (~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) |
| 13:14:03 | × | vglfr quits (~vglfr@coupling.penchant.volia.net) (Ping timeout: 256 seconds) |
| 13:14:15 | → | vglfr joins (~vglfr@coupling.penchant.volia.net) |
| 13:15:30 | <chronon> | Is it really true that 1-ary tuples are not allowed to exist at alll in Haskell? Python has the syntax (123,) with that extra comma to differentiate tuples from mere parentheses. |
| 13:16:01 | → | slowButPresent joins (~slowButPr@user/slowbutpresent) |
| 13:16:16 | × | jao quits (~jao@68.235.43.84) (Ping timeout: 250 seconds) |
| 13:18:29 | <kritzefitz> | chronon: Arguably there is a 1-ary tuple in Haskell, it's just called Identity. |
| 13:19:06 | <chronon> | But that would not have type tuple, unless I'm misunderstanding something. |
| 13:20:00 | <kritzefitz> | Formally, there is no “tuple type” that is common between all tuples, because all tuples of different lengths necessarily have different types. |
| 13:20:13 | → | razetime joins (~quassel@117.254.35.46) |
| 13:21:08 | <chronon> | Right. I was about to suggest.. ok got it. Thanks. |
| 13:21:10 | → | coot joins (~coot@213.134.190.95) |
| 13:21:47 | <kritzefitz> | This makes 1-ary tuples much less useful in Haskell than in Python, because in Python a 1-ary tuple is a special case of n-ary tuples. In Haskell tuples of different lengths don't really have anything in common. |
| 13:23:06 | <chronon> | Right. Makes sense. |
| 13:27:38 | → | alx741 joins (~alx741@181.199.42.143) |
| 13:30:56 | × | alx741 quits (~alx741@181.199.42.143) (Read error: Connection reset by peer) |
| 13:33:19 | × | vglfr quits (~vglfr@coupling.penchant.volia.net) (Ping timeout: 256 seconds) |
| 13:36:56 | → | azimut_ joins (~azimut@gateway/tor-sasl/azimut) |
| 13:37:14 | → | vglfr joins (~vglfr@coupling.penchant.volia.net) |
| 13:37:25 | → | Null_A joins (~null_a@2601:645:8700:2290:890f:d3a0:aab0:f3f) |
| 13:38:56 | × | azimut quits (~azimut@gateway/tor-sasl/azimut) (Ping timeout: 240 seconds) |
| 13:43:30 | → | Midjak joins (~Midjak@82.66.147.146) |
| 13:47:24 | × | merijn quits (~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) (Ping timeout: 240 seconds) |
| 13:47:53 | → | alx741 joins (~alx741@157.100.197.240) |
| 13:49:45 | <Inst[m]> | kritzefitz: how do tuples work in Haskell? |
| 13:49:49 | <Inst[m]> | I have fst, snd, pattern matching |
| 13:49:55 | <Inst[m]> | but how do I manipulate tuples? |
| 13:49:56 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 13:50:19 | × | jtomas quits (~jtomas@210.red-88-24-179.staticip.rima-tde.net) (Ping timeout: 256 seconds) |
| 13:51:38 | → | ProfSimm joins (~ProfSimm@176-12-60-137.pon.spectrumnet.bg) |
| 13:52:41 | <geekosaur> | that's basically it. inparticular you cannot iterate over a tuple without type level magick |
| 13:53:01 | <geekosaur> | also fst and snd only work on 2-tuples |
| 13:53:21 | × | ncopa quits (~ncopa@alpine/developer/ncopa) (Quit: Alpine Linux, the security-oriented, lightweight Linux distribution) |
| 13:54:18 | → | dyeplexer joins (~dyeplexer@user/dyeplexer) |
| 13:54:37 | × | Null_A quits (~null_a@2601:645:8700:2290:890f:d3a0:aab0:f3f) (Ping timeout: 256 seconds) |
| 13:55:24 | × | Vajb quits (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Ping timeout: 240 seconds) |
| 13:55:35 | → | ncopa joins (~ncopa@gbr2-dev1.alpinelinux.org) |
| 13:57:17 | → | Vajb joins (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) |
| 13:59:17 | × | alp quits (~alp@user/alp) (Ping timeout: 240 seconds) |
| 14:01:34 | × | max22- quits (~maxime@2a01cb0883359800bbcc7fa8d7db61b8.ipv6.abo.wanadoo.fr) (Ping timeout: 260 seconds) |
| 14:01:49 | × | kritzefitz quits (~kritzefit@debian/kritzefitz) (Ping timeout: 240 seconds) |
| 14:04:02 | → | kritzefitz joins (~kritzefit@debian/kritzefitz) |
| 14:07:00 | → | alx741 joins (~alx741@157.100.197.240) |
| 14:07:46 | <pavonia> | Inst[m]: Manipulating tuples in Haskell basically means deconstructing them and building new ones based on the original or new values |
| 14:09:53 | → | Unicorn_Princess joins (~Unicorn_P@93-103-228-248.dynamic.t-2.net) |
| 14:10:00 | × | cheater quits (~Username@user/cheater) (Ping timeout: 250 seconds) |
| 14:10:01 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 14:13:16 | → | cheater joins (~Username@user/cheater) |
| 14:18:35 | → | AlexNoo_ joins (~AlexNoo@178.34.160.240) |
| 14:21:48 | × | Alex_test quits (~al_test@94.233.240.208) (Ping timeout: 240 seconds) |
| 14:22:03 | × | AlexNoo quits (~AlexNoo@94.233.240.208) (Ping timeout: 252 seconds) |
| 14:22:12 | × | AlexZenon quits (~alzenon@94.233.240.208) (Ping timeout: 240 seconds) |
| 14:23:53 | → | Null_A joins (~null_a@c-98-210-133-39.hsd1.ca.comcast.net) |
| 14:23:53 | → | alp joins (~alp@user/alp) |
| 14:25:44 | → | Alex_test joins (~al_test@178.34.160.240) |
| 14:26:07 | → | AlexZenon joins (~alzenon@178.34.160.240) |
| 14:26:52 | × | kritzefitz quits (~kritzefit@debian/kritzefitz) (Ping timeout: 256 seconds) |
| 14:28:17 | × | Null_A quits (~null_a@c-98-210-133-39.hsd1.ca.comcast.net) (Ping timeout: 240 seconds) |
| 14:28:37 | → | alx741 joins (~alx741@157.100.197.240) |
| 14:31:27 | × | alp quits (~alp@user/alp) (Ping timeout: 256 seconds) |
| 14:31:33 | AlexNoo_ | is now known as AlexNoo |
| 14:32:01 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 14:33:10 | → | machinedgod joins (~machinedg@24.105.81.50) |
| 14:33:23 | × | mon_aaraj quits (~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 256 seconds) |
| 14:35:21 | × | Vajb quits (~Vajb@hag-jnsbng11-58c3a8-176.dhcp.inet.fi) (Read error: Connection reset by peer) |
| 14:35:25 | → | mon_aaraj joins (~MonAaraj@user/mon-aaraj/x-4416475) |
| 14:35:40 | → | max22- joins (~maxime@2a01cb088335980000d616136ecfccf9.ipv6.abo.wanadoo.fr) |
| 14:36:14 | → | Vajb joins (~Vajb@2001:999:274:c862:3b86:e1e1:5bff:355e) |
| 14:37:01 | → | wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com) |
| 14:37:01 | × | wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
| 14:37:01 | → | wroathe joins (~wroathe@user/wroathe) |
| 14:44:57 | <FernandoChu[m]> | multiline evals in HLS are not working for me, any ideas? Running the example in the docs gives me `unknown command '{'` https://github.com/haskell/haskell-language-server/blob/master/plugins/hls-eval-plugin/README.md#multiline-expressions |
| 14:45:37 | <FernandoChu[m]> | running vscode with ghc 8.10.7 if it matters |
| 14:46:37 | <geekosaur> | I believe the point of that is exactly that miultilines don't work in HLS (that's a doctest example) |
| 14:48:18 | → | [itchyjunk] joins (~itchyjunk@user/itchyjunk/x-7353470) |
| 14:48:39 | → | alx741 joins (~alx741@157.100.197.240) |
| 14:49:26 | <FernandoChu[m]> | oops skimmed too fast |
| 14:49:29 | <FernandoChu[m]> | thanks |
| 14:53:20 | × | xff0x quits (~xff0x@2001:1a81:52c9:2700:23a4:7c27:1274:b7bc) (Ping timeout: 250 seconds) |
| 14:53:21 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 14:54:57 | × | hughjfchen quits (~hughjfche@vmi556545.contaboserver.net) (Quit: WeeChat 2.8) |
| 14:58:19 | × | hueso quits (~root@user/hueso) (Ping timeout: 256 seconds) |
| 14:58:25 | × | coot quits (~coot@213.134.190.95) (Quit: coot) |
| 14:59:38 | → | xff0x joins (~xff0x@2001:1a81:52c9:2700:23a4:7c27:1274:b7bc) |
| 15:02:48 | → | hughjfchen joins (~hughjfche@vmi556545.contaboserver.net) |
| 15:04:23 | → | hueso joins (~root@user/hueso) |
| 15:09:59 | × | Hanicef quits (~gustaf@81-229-9-108-no92.tbcn.telia.com) (Quit: leaving) |
| 15:11:10 | → | alx741 joins (~alx741@157.100.197.240) |
| 15:11:50 | → | kritzefitz joins (~kritzefit@debian/kritzefitz) |
| 15:12:14 | × | averell quits (~averell@user/averell) (Remote host closed the connection) |
| 15:20:55 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 15:21:53 | × | euandreh quits (~euandreh@2804:14c:33:9fe5:41b:9f3:a75a:9b8b) (Ping timeout: 256 seconds) |
| 15:23:43 | → | euandreh joins (~euandreh@2804:14c:33:9fe5:41b:9f3:a75a:9b8b) |
| 15:27:29 | → | xkuru joins (~xkuru@user/xkuru) |
| 15:27:51 | → | arievw joins (~arievw@85.148.234.95) |
| 15:27:57 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 240 seconds) |
| 15:30:50 | × | ix quits (~ix@2a02:8010:674f:0:d65d:64ff:fe52:5efe) (Quit: WeeChat 3.4) |
| 15:30:58 | → | ix joins (~ix@2a02:8010:674f:0:d65d:64ff:fe52:5efe) |
| 15:32:21 | → | neurocyte0917090 joins (~neurocyte@IP-045014189135.dynamic.medianet-world.de) |
| 15:32:22 | × | neurocyte0917090 quits (~neurocyte@IP-045014189135.dynamic.medianet-world.de) (Changing host) |
| 15:32:22 | → | neurocyte0917090 joins (~neurocyte@user/neurocyte) |
| 15:33:48 | × | ix quits (~ix@2a02:8010:674f:0:d65d:64ff:fe52:5efe) (Client Quit) |
| 15:33:56 | → | ix joins (~ix@2a02:8010:674f:0:d65d:64ff:fe52:5efe) |
| 15:35:06 | → | vysn joins (~vysn@user/vysn) |
| 15:37:07 | → | alx741 joins (~alx741@157.100.197.240) |
| 15:40:28 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 15:40:34 | → | yauhsien_ joins (~yauhsien@61-231-37-106.dynamic-ip.hinet.net) |
| 15:47:54 | × | deadmarshal quits (~deadmarsh@95.38.113.80) (Ping timeout: 256 seconds) |
| 15:49:54 | → | deadmarshal joins (~deadmarsh@95.38.113.80) |
| 15:52:32 | × | neurocyte0917090 quits (~neurocyte@user/neurocyte) (Quit: The Lounge - https://thelounge.chat) |
| 15:52:53 | → | coot joins (~coot@213.134.190.95) |
| 15:57:43 | → | neurocyte0917090 joins (~neurocyte@ip-045014189135.dynamic.medianet-world.de) |
| 15:57:43 | × | neurocyte0917090 quits (~neurocyte@ip-045014189135.dynamic.medianet-world.de) (Changing host) |
| 15:57:43 | → | neurocyte0917090 joins (~neurocyte@user/neurocyte) |
| 15:58:17 | → | eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:5928:8400:a51e:7799) |
| 15:58:44 | → | alx741 joins (~alx741@157.100.197.240) |
| 16:00:52 | → | jtomas joins (~jtomas@210.red-88-24-179.staticip.rima-tde.net) |
| 16:02:06 | → | tzh joins (~tzh@c-24-21-73-154.hsd1.or.comcast.net) |
| 16:02:06 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 16:02:37 | × | eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:5928:8400:a51e:7799) (Ping timeout: 240 seconds) |
| 16:09:58 | justGhost | is now known as justAstache |
| 16:11:36 | × | ProfSimm quits (~ProfSimm@176-12-60-137.pon.spectrumnet.bg) (Remote host closed the connection) |
| 16:11:56 | → | ProfSimm joins (~ProfSimm@176-12-60-137.pon.spectrumnet.bg) |
| 16:13:40 | → | Ariakenom__ joins (~Ariakenom@2001:9b1:efe:9d00:7c26:4e8e:84e:d7a1) |
| 16:14:15 | × | kritzefitz quits (~kritzefit@debian/kritzefitz) (Ping timeout: 256 seconds) |
| 16:16:31 | × | ProfSimm quits (~ProfSimm@176-12-60-137.pon.spectrumnet.bg) (Ping timeout: 256 seconds) |
| 16:20:07 | → | alx741 joins (~alx741@157.100.197.240) |
| 16:23:47 | → | Ariakenom_ joins (~Ariakenom@h-82-196-111-63.NA.cust.bahnhof.se) |
| 16:23:47 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 16:27:38 | × | Ariakenom__ quits (~Ariakenom@2001:9b1:efe:9d00:7c26:4e8e:84e:d7a1) (Ping timeout: 260 seconds) |
| 16:40:10 | → | alx741 joins (~alx741@181.199.42.143) |
| 16:41:05 | → | awpr joins (uid446117@id-446117.lymington.irccloud.com) |
| 16:42:39 | × | pavonia quits (~user@user/siracusa) (Quit: Bye!) |
| 16:43:15 | × | alx741 quits (~alx741@181.199.42.143) (Read error: Connection reset by peer) |
| 16:43:55 | × | yauhsien_ quits (~yauhsien@61-231-37-106.dynamic-ip.hinet.net) (Remote host closed the connection) |
| 16:44:37 | × | mon_aaraj quits (~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 240 seconds) |
| 16:44:46 | → | yauhsien_ joins (~yauhsien@61-231-37-106.dynamic-ip.hinet.net) |
| 16:45:12 | tremon | is now known as tremon_ |
| 16:46:43 | × | doyougnu quits (~doyougnu@cpe-67-249-83-190.twcny.res.rr.com) (Ping timeout: 272 seconds) |
| 16:46:51 | → | mon_aaraj joins (~MonAaraj@user/mon-aaraj/x-4416475) |
| 16:47:25 | → | michalz joins (~michalz@185.246.204.45) |
| 16:47:32 | → | wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com) |
| 16:47:32 | × | wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
| 16:47:32 | → | wroathe joins (~wroathe@user/wroathe) |
| 16:48:01 | → | sebastiandb joins (~sebastian@pool-173-79-64-34.washdc.fios.verizon.net) |
| 16:49:24 | × | yauhsien_ quits (~yauhsien@61-231-37-106.dynamic-ip.hinet.net) (Ping timeout: 240 seconds) |
| 16:49:48 | <sebastiandb> | I was having trouble getting ghcid set up, can I ask for help on this channel? I'm pretty much a beginner, and I'm trying to set up an environment to learn Haskell. |
| 16:50:59 | <geekosaur> | you can ask in here but I'm not sure anyone who could be helpful is around at the moment; you might want to ask your question and stick around |
| 16:51:11 | <sebastiandb> | Makes sense, thanks. |
| 16:51:55 | <sebastiandb> | Basically, if I load ghcid without any arguments, it tells me GHCi isn't working properly. "No files loaded, GHCi is not working properly." |
| 16:52:08 | <sebastiandb> | Is that meant to be the default behavior? |
| 16:53:17 | <geekosaur> | the default is to run ghci directly. if you are using stack or a cabal project, you'll need to tell ghcid to use stack ghci or cabal repl, respectively, because otherwise it won't find its dependencies |
| 16:54:29 | × | neurocyte0917090 quits (~neurocyte@user/neurocyte) (Ping timeout: 256 seconds) |
| 16:55:23 | <sebastiandb> | How can I do that? Do I load something like a .ghci file in my local directory? |
| 16:56:33 | <sebastiandb> | Also, I installed it using cabal at first, because for some reason stack wasn't working. And then I installed it with stack. It seems like there isn't any way to uninstall cabal packages, too. Was that something I shouldn't have done? |
| 16:56:56 | <geekosaur> | actually it looks like it will use stack ghci or cabal repl by itselfifit finds the appropriate files. hardest is if you just use plain ghci, you'll need to create an appropriate .ghci file at the root of the project |
| 16:58:19 | <sebastiandb> | Yeah, it seems to load a cabal repl by default, and then gives that message from earlier. That makes sense, what you're saying. |
| 16:58:45 | <sebastiandb> | Specifically, it says this: "GHCi, version 8.10.7: https://www.haskell.org/ghc/ :? for help |
| 16:58:45 | <sebastiandb> | Loaded GHCi configuration from /tmp/cabal-repl.-18331/setcwd.ghci |
| 16:58:45 | <sebastiandb> | No files loaded, GHCi is not working properly." |
| 16:59:29 | <sebastiandb> | Sorry for all the questions, I'm just kind of confused at a a lot of things. It seems to be loading from /tmp/, which is weird. |
| 16:59:43 | <geekosaur> | that is just how it configures cabal repl |
| 17:00:22 | <geekosaur> | but you said you were using stack? you'll need to pass --command="stack ghci" |
| 17:00:24 | → | alx741 joins (~alx741@157.100.197.240) |
| 17:00:27 | <sclv> | you have to run it as `ghcid "--command=ghci Main.hs"` or with whatever the command is that you want to pass it that will actually run a repl with the files you want loaded. |
| 17:00:51 | <sclv> | so you find the command line invocation that brings up ghci with your files loaded, and then whatever that command line is, you tell it to ghcid when you launch it |
| 17:00:53 | <geekosaur> | in general you don't remove packages with either cabal or stack |
| 17:01:23 | <sclv> | also ghcid is an executable, so cabal installing it just dropped a binary (or a symlink to a binary) in some directory on your path is all. |
| 17:03:02 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 17:03:41 | <sebastiandb> | I see. Yeah, I just passed --command="ghci test.hs" to it. And now it's loaded, and doesn't seem to be responding to any of my commands? Thanks for the info, though. I installed cabal and stack at first because I guess I was confused at which to use? I installed them a while ago. |
| 17:05:05 | <geekosaur> | the usual idea is it doesn't |
| 17:05:38 | <geekosaur> | it just watches for files to change and restarts ghci automatically, then shuts it down. you're looking for error messages from the attempt to compile |
| 17:05:59 | <geekosaur> | if you're looking for an interactive ghci, just run ghci directly |
| 17:06:35 | <sebastiandb> | I get it, now. And through this, I use a plugin for my editor or something, and that's how it's meant to be used, then? |
| 17:06:46 | <sebastiandb> | Thanks for answering my questions so far |
| 17:08:44 | × | razetime quits (~quassel@117.254.35.46) (Quit: https://quassel-irc.org - Chat comfortably. Anywhere.) |
| 17:09:07 | → | razetime joins (~quassel@117.254.35.46) |
| 17:10:21 | <geekosaur> | this doesn't really need an editor plugin, it does all the work itself. ad it's pretty simplistic. if you want a more traditional IDE setup, there's haskell-language-server which works with a numberof editors and in particular the VS Code Haskell plugin knows how to use it out of the box |
| 17:11:35 | <sebastiandb> | I got the sense that haskell-language-server and ghcid covered different things? That's why there's this neovim plugin for it. https://github.com/ndmitchell/ghcid/tree/master/plugins/nvim |
| 17:12:26 | × | Vajb quits (~Vajb@2001:999:274:c862:3b86:e1e1:5bff:355e) (Ping timeout: 260 seconds) |
| 17:12:54 | <sebastiandb> | But now I think I'm getting how it's meant to work. You have a terminal window with ghcid open, and run your editor in a different window, and check ghcid every now and then. |
| 17:13:02 | <geekosaur> | yep |
| 17:13:44 | × | razetime quits (~quassel@117.254.35.46) (Client Quit) |
| 17:14:00 | → | razetime joins (~quassel@117.254.35.46) |
| 17:14:10 | × | razetime quits (~quassel@117.254.35.46) (Client Quit) |
| 17:14:33 | → | razetime joins (~quassel@117.254.35.46) |
| 17:15:05 | × | razetime quits (~quassel@117.254.35.46) (Client Quit) |
| 17:17:11 | <sebastiandb> | Thanks for the help! Appreciate it. |
| 17:20:54 | → | alx741 joins (~alx741@181.199.42.143) |
| 17:23:25 | × | alx741 quits (~alx741@181.199.42.143) (Read error: Connection reset by peer) |
| 17:24:19 | → | yauhsien_ joins (~yauhsien@61-231-37-106.dynamic-ip.hinet.net) |
| 17:24:51 | → | DNH joins (~DNH@2a02:8108:1100:16d8:682c:7604:30f7:a4ea) |
| 17:27:55 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 256 seconds) |
| 17:32:51 | × | tabemann quits (~travisb@172-13-49-137.lightspeed.milwwi.sbcglobal.net) (Remote host closed the connection) |
| 17:33:42 | → | wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com) |
| 17:33:42 | × | wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
| 17:33:42 | → | wroathe joins (~wroathe@user/wroathe) |
| 17:36:12 | → | travisb joins (~travisb@172-13-49-137.lightspeed.milwwi.sbcglobal.net) |
| 17:38:39 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 272 seconds) |
| 17:40:13 | → | alx741 joins (~alx741@157.100.197.240) |
| 17:44:07 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 17:44:53 | → | merijn joins (~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) |
| 17:45:45 | → | zebrag joins (~chris@user/zebrag) |
| 17:46:57 | × | nabaiste^ quits (~nabaiste@50.233.120.162) (Ping timeout: 240 seconds) |
| 17:48:56 | ← | sebastiandb parts (~sebastian@pool-173-79-64-34.washdc.fios.verizon.net) (Leaving) |
| 17:50:18 | × | cheater quits (~Username@user/cheater) (Ping timeout: 256 seconds) |
| 17:51:25 | → | dspyz joins (~dspyz@135-180-196-116.fiber.dynamic.sonic.net) |
| 17:53:28 | → | cheater joins (~Username@user/cheater) |
| 17:54:54 | × | zaquest quits (~notzaques@5.130.79.72) (Ping timeout: 252 seconds) |
| 17:57:43 | → | zaquest joins (~notzaques@5.130.79.72) |
| 17:59:49 | → | nabaiste^ joins (~nabaiste@50.233.120.162) |
| 18:00:02 | → | eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:5928:8400:a51e:7799) |
| 18:01:50 | → | alx741 joins (~alx741@157.100.197.240) |
| 18:02:16 | → | dspyz_ joins (~david@135-180-196-116.fiber.dynamic.sonic.net) |
| 18:02:22 | → | CiaoSen joins (~Jura@p200300c95737a2002a3a4dfffe84dbd5.dip0.t-ipconnect.de) |
| 18:02:43 | × | yauhsien_ quits (~yauhsien@61-231-37-106.dynamic-ip.hinet.net) (Ping timeout: 272 seconds) |
| 18:02:46 | × | dspyz quits (~dspyz@135-180-196-116.fiber.dynamic.sonic.net) (Quit: Client closed) |
| 18:03:01 | <dspyz_> | Is hp2ps still in use? Or is there a better tool? |
| 18:04:12 | × | eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:5928:8400:a51e:7799) (Ping timeout: 240 seconds) |
| 18:04:15 | <geekosaur> | still in use although hp2pretty masy be better for some things |
| 18:04:50 | <dspyz_> | When I run without `-M` it cuts off the names with `...`; when I run _with_ `-M`, it just doesn't include the key at all |
| 18:04:50 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 18:05:07 | <dspyz_> | I can't figure out how to see the full key |
| 18:07:25 | <dspyz_> | Seems to be true with hp2pretty as well |
| 18:09:34 | <dspyz_> | Oh, there's a number. I guess I can cross-reference against the original .hp file |
| 18:09:37 | <dspyz_> | Still that's annoying |
| 18:10:16 | <dspyz_> | Huh? The `.hp` file _also_ has the names cut off with `...` |
| 18:11:56 | → | burnsidesLlama joins (~burnsides@dhcp168-012.wadham.ox.ac.uk) |
| 18:12:03 | <geekosaur> | yeh, I was just digging in the release notes because I vaguely recall this being fixed in some ghc release. what version of ghc are you using? |
| 18:12:43 | <dspyz_> | 8.10.7 |
| 18:13:07 | <dspyz_> | (the one on the latest `stackage` lts) |
| 18:15:23 | × | mon_aaraj quits (~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 272 seconds) |
| 18:15:39 | → | raehik joins (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) |
| 18:17:09 | → | mon_aaraj joins (~MonAaraj@user/mon-aaraj/x-4416475) |
| 18:17:19 | → | dhil joins (~dhil@cpc103052-sgyl39-2-0-cust260.18-2.cable.virginm.net) |
| 18:18:36 | × | merijn quits (~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) (Ping timeout: 240 seconds) |
| 18:19:50 | <dspyz_> | What tools are there for reading `.prof` files (JSON or normal)? |
| 18:20:21 | → | yauhsien_ joins (~yauhsien@61-231-37-106.dynamic-ip.hinet.net) |
| 18:20:27 | × | raehik quits (~raehik@cpc95906-rdng25-2-0-cust156.15-3.cable.virginm.net) (Ping timeout: 272 seconds) |
| 18:21:08 | <geekosaur> | not many. I think the intent is to move to eventlog files, for which there are many tools |
| 18:21:51 | <dspyz_> | Well, what do people do for profiling Haskell right now? |
| 18:22:31 | <dspyz_> | For that matter, why does the `-pj` option even _exist_ if there are no tools to read the output? |
| 18:22:57 | <dspyz_> | Presumably, whoever added that wouldn't have thought to include it unless they intended it to be read by _something_ |
| 18:23:14 | → | alx741 joins (~alx741@157.100.197.240) |
| 18:27:12 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 18:27:56 | <geekosaur> | -L ⟨num⟩ |
| 18:27:56 | <geekosaur> | Sets the maximum length of a cost-centre stack name in a heap profile. Defaults to 25. |
| 18:28:20 | <geekosaur> | (RTS option) |
| 18:29:49 | × | arievw quits (~arievw@85.148.234.95) (Quit: Nettalk6 - www.ntalk.de) |
| 18:31:46 | × | michalz quits (~michalz@185.246.204.45) (Ping timeout: 260 seconds) |
| 18:32:00 | × | azimut_ quits (~azimut@gateway/tor-sasl/azimut) (Remote host closed the connection) |
| 18:32:27 | → | azimut joins (~azimut@gateway/tor-sasl/azimut) |
| 18:33:26 | <dspyz_> | @geekosaur Thanks |
| 18:33:26 | <lambdabot> | Unknown command, try @list |
| 18:34:09 | → | fef joins (~thedawn@user/thedawn) |
| 18:34:10 | → | c209e6dc-4d76-47 joins (~aditya@2601:249:4300:1296:195:dac6:592c:a55a) |
| 18:35:31 | polyphem_ | wonders if the lamdabot prefix @ is configurable |
| 18:35:42 | polyphem_ | is now known as polyphem |
| 18:36:34 | <geekosaur> | iirc it is, but only at compile time |
| 18:37:37 | × | notzmv quits (~zmv@user/notzmv) (Ping timeout: 240 seconds) |
| 18:37:38 | → | isovector1 joins (~isovector@172.103.216.166.cable.tpia.cipherkey.com) |
| 18:38:10 | → | michalz joins (~michalz@185.246.204.33) |
| 18:38:14 | <isovector1> | has anyone used shake in forward mode? |
| 18:38:26 | <isovector1> | i'm wondering if i can still use caches and oracles if doing it in forward mode |
| 18:38:28 | <sm> | dspyz_: profiterole is a simple one that makes prof files clearer |
| 18:38:48 | → | zincy_ joins (~zincy@host86-160-236-152.range86-160.btcentralplus.com) |
| 18:38:54 | <sm> | there are actually lots of profiling tools. event2html might be a newer one |
| 18:39:20 | → | Topsi joins (~Tobias@95.33.25.255) |
| 18:39:32 | <dspyz_> | sm, where are you finding these? |
| 18:40:12 | <ski> | dspyz_ : IRC custom is to not adorn nicknames with sigils (like `@'), but rather to simply mention the nickname, when referring to, or addressing, someone. in the latter caes, you could mention the nickname, then a colon or a comman, and then the message. most IRC clients will highlight/alert the user if their nickname is mentioned, first thing, in a message. not as many will do that, if the nickname occurs |
| 18:40:15 | <sm> | hackage search, web search, past announcements, ghc user guide chapter on performance |
| 18:40:18 | <ski> | later in a message |
| 18:40:52 | <ski> | (prefixing with `@' causes the nickname to not be the first thing. besides, `@' already means something else on IRC (channel operator)) |
| 18:41:28 | <dspyz_> | Thanks ski |
| 18:41:30 | × | dyeplexer quits (~dyeplexer@user/dyeplexer) (Remote host closed the connection) |
| 18:42:27 | <dspyz_> | sm I was looking at the ghc user guide chapter on performance and didn't see any mentioned. I don't know what to search to get results; everything keeps taking me back to old versions of the GHC user guide |
| 18:42:46 | <dspyz_> | (which mentions only `hp2ps`) |
| 18:44:01 | <sm> | dspyz_: i think there's no only complete list. I'd check the haskell wiki too |
| 18:44:12 | <sm> | no one complete list |
| 18:45:46 | → | alx741 joins (~alx741@157.100.197.240) |
| 18:46:36 | × | jtomas quits (~jtomas@210.red-88-24-179.staticip.rima-tde.net) (Ping timeout: 240 seconds) |
| 18:49:26 | × | geekosaur quits (~geekosaur@xmonad/geekosaur) (Remote host closed the connection) |
| 18:49:48 | × | yauhsien_ quits (~yauhsien@61-231-37-106.dynamic-ip.hinet.net) (Ping timeout: 256 seconds) |
| 18:51:01 | → | geekosaur joins (~geekosaur@xmonad/geekosaur) |
| 18:51:16 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 18:51:59 | → | econo joins (uid147250@user/econo) |
| 18:52:01 | → | Null_A joins (~null_a@2601:645:8700:2290:890f:d3a0:aab0:f3f) |
| 18:53:46 | × | mon_aaraj quits (~MonAaraj@user/mon-aaraj/x-4416475) (Ping timeout: 256 seconds) |
| 18:55:04 | → | doyougnu joins (~doyougnu@cpe-67-249-83-190.twcny.res.rr.com) |
| 18:55:30 | → | mon_aaraj joins (~MonAaraj@user/mon-aaraj/x-4416475) |
| 18:55:37 | × | TonyStone quits (~TonyStone@2603-7080-8607-c36a-b0ed-1a92-719b-f6c2.res6.spectrum.com) (Ping timeout: 240 seconds) |
| 18:55:46 | s5smong | is now known as s4msung |
| 18:56:36 | × | Null_A quits (~null_a@2601:645:8700:2290:890f:d3a0:aab0:f3f) (Ping timeout: 240 seconds) |
| 18:59:32 | → | wroathe joins (~wroathe@user/wroathe) |
| 19:01:37 | × | hgolden quits (~hgolden2@cpe-172-114-81-123.socal.res.rr.com) (Remote host closed the connection) |
| 19:02:02 | × | isovector1 quits (~isovector@172.103.216.166.cable.tpia.cipherkey.com) (Quit: Leaving) |
| 19:06:11 | × | mcglk quits (~mcglk@131.191.49.120) (Read error: Connection reset by peer) |
| 19:09:08 | × | dhil quits (~dhil@cpc103052-sgyl39-2-0-cust260.18-2.cable.virginm.net) (Remote host closed the connection) |
| 19:09:14 | → | mcglk joins (~mcglk@131.191.49.120) |
| 19:09:26 | → | alx741 joins (~alx741@157.100.197.240) |
| 19:10:49 | × | zincy_ quits (~zincy@host86-160-236-152.range86-160.btcentralplus.com) (Remote host closed the connection) |
| 19:11:07 | → | zincy_ joins (~zincy@2a00:23c8:970c:4801:39f9:90f7:922:e73b) |
| 19:11:38 | × | zincy_ quits (~zincy@2a00:23c8:970c:4801:39f9:90f7:922:e73b) (Remote host closed the connection) |
| 19:12:53 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 19:18:40 | ← | dspyz_ parts (~david@135-180-196-116.fiber.dynamic.sonic.net) (Leaving) |
| 19:21:24 | → | Sgeo joins (~Sgeo@user/sgeo) |
| 19:21:29 | → | waleee joins (~waleee@h-98-128-229-110.NA.cust.bahnhof.se) |
| 19:27:24 | → | Null_A joins (~null_a@2601:645:8700:2290:a4fb:481a:7fa9:b909) |
| 19:29:27 | → | alx741 joins (~alx741@157.100.197.240) |
| 19:31:57 | × | Null_A quits (~null_a@2601:645:8700:2290:a4fb:481a:7fa9:b909) (Ping timeout: 240 seconds) |
| 19:32:36 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 19:32:59 | × | coot quits (~coot@213.134.190.95) (Quit: coot) |
| 19:33:24 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 240 seconds) |
| 19:33:47 | → | TonyStone joins (~TonyStone@cpe-74-76-51-197.nycap.res.rr.com) |
| 19:39:15 | → | wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com) |
| 19:39:15 | × | wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
| 19:39:15 | → | wroathe joins (~wroathe@user/wroathe) |
| 19:41:36 | × | mvk quits (~mvk@2607:fea8:5cdc:bf00::99e7) (Quit: Going elsewhere) |
| 19:42:34 | → | mvk joins (~mvk@2607:fea8:5cdc:bf00::99e7) |
| 19:42:58 | → | Lord_of_Life_ joins (~Lord@user/lord-of-life/x-2819915) |
| 19:43:41 | × | wroathe quits (~wroathe@user/wroathe) (Ping timeout: 245 seconds) |
| 19:44:12 | × | Lord_of_Life quits (~Lord@user/lord-of-life/x-2819915) (Ping timeout: 256 seconds) |
| 19:44:14 | Lord_of_Life_ | is now known as Lord_of_Life |
| 19:46:21 | → | Null_A joins (~null_a@2601:645:8700:2290:890f:d3a0:aab0:f3f) |
| 19:47:38 | → | eggplantade joins (~Eggplanta@2600:1700:bef1:5e10:5928:8400:a51e:7799) |
| 19:48:00 | × | xff0x quits (~xff0x@2001:1a81:52c9:2700:23a4:7c27:1274:b7bc) (Ping timeout: 250 seconds) |
| 19:48:15 | × | mvk quits (~mvk@2607:fea8:5cdc:bf00::99e7) (Quit: Going elsewhere) |
| 19:48:31 | × | DNH quits (~DNH@2a02:8108:1100:16d8:682c:7604:30f7:a4ea) (Quit: My MacBook has gone to sleep. ZZZzzz…) |
| 19:48:50 | → | xff0x joins (~xff0x@2001:1a81:52c9:2700:c4c8:f455:66db:3020) |
| 19:49:23 | → | mvk joins (~mvk@2607:fea8:5cdc:bf00::99e7) |
| 19:49:28 | → | alx741 joins (~alx741@157.100.197.240) |
| 19:49:41 | → | justsomeguy joins (~justsomeg@user/justsomeguy) |
| 19:51:05 | → | notzmv joins (~zmv@user/notzmv) |
| 19:51:51 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 19:55:23 | × | mvk quits (~mvk@2607:fea8:5cdc:bf00::99e7) (Quit: Going elsewhere) |
| 19:55:56 | × | fendor_ quits (~fendor@178.165.200.21.wireless.dyn.drei.com) (Remote host closed the connection) |
| 19:57:23 | → | mvk joins (~mvk@2607:fea8:5cdc:bf00::99e7) |
| 19:57:24 | × | perrierjouet quits (~perrier-j@modemcable012.251-130-66.mc.videotron.ca) (Ping timeout: 240 seconds) |
| 20:00:43 | × | juhp quits (~juhp@128.106.188.82) (Remote host closed the connection) |
| 20:06:40 | → | juhp joins (~juhp@128.106.188.82) |
| 20:07:33 | → | DNH joins (~DNH@2a02:8108:1100:16d8:682c:7604:30f7:a4ea) |
| 20:09:57 | → | alx741 joins (~alx741@157.100.197.240) |
| 20:12:32 | → | wootehfoot joins (~wootehfoo@user/wootehfoot) |
| 20:13:25 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 20:14:36 | × | fef quits (~thedawn@user/thedawn) (Ping timeout: 240 seconds) |
| 20:18:12 | <Athas> | Is there a way to run Haddock on a single module? It takes a long time to run on my entire program, and I'm just writing some (long-form) documentation in one module at the moment. |
| 20:19:54 | × | justsomeguy quits (~justsomeg@user/justsomeguy) (Ping timeout: 256 seconds) |
| 20:21:05 | × | [itchyjunk] quits (~itchyjunk@user/itchyjunk/x-7353470) (Remote host closed the connection) |
| 20:22:36 | × | adanwan quits (~adanwan@gateway/tor-sasl/adanwan) (Ping timeout: 240 seconds) |
| 20:22:51 | → | adanwan joins (~adanwan@gateway/tor-sasl/adanwan) |
| 20:23:45 | × | nabaiste^ quits (~nabaiste@50.233.120.162) (Remote host closed the connection) |
| 20:24:11 | × | synthmeat quits (~synthmeat@user/synthmeat) (Quit: WeeChat 3.0) |
| 20:24:24 | → | synthmeat joins (~synthmeat@user/synthmeat) |
| 20:25:17 | → | gehmehgeh joins (~user@user/gehmehgeh) |
| 20:28:31 | × | cosimone quits (~user@93-47-228-207.ip115.fastwebnet.it) (Remote host closed the connection) |
| 20:29:59 | → | alx741 joins (~alx741@157.100.197.240) |
| 20:30:36 | × | hyiltiz quits (~quassel@31.220.5.250) (Ping timeout: 240 seconds) |
| 20:31:06 | <janus> | Athas: there is a new -Winvalid-haddock flag in ghc9, though i guess that wouldn't be sufficient for you |
| 20:33:11 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 20:33:30 | × | Null_A quits (~null_a@2601:645:8700:2290:890f:d3a0:aab0:f3f) (Ping timeout: 250 seconds) |
| 20:34:03 | → | hyiltiz joins (~quassel@31.220.5.250) |
| 20:35:00 | × | ystael quits (~ystael@user/ystael) (Ping timeout: 240 seconds) |
| 20:35:24 | × | doyougnu quits (~doyougnu@cpe-67-249-83-190.twcny.res.rr.com) (Ping timeout: 240 seconds) |
| 20:37:10 | × | acidsys quits (~LSD@2a03:4000:55:d20::3) (Excess Flood) |
| 20:41:40 | <considerate[m]> | Athas: Yes, you can run `haddock` on a single file. |
| 20:41:40 | <considerate[m]> | https://haskell-haddock.readthedocs.io/en/latest/invoking.html#invoking-haddock |
| 20:44:00 | → | Erutuon joins (~Erutuon@user/erutuon) |
| 20:45:10 | → | zincy_ joins (~zincy@2a00:23c8:970c:4801:39f9:90f7:922:e73b) |
| 20:47:06 | → | ystael joins (~ystael@user/ystael) |
| 20:49:19 | → | k8yun joins (~k8yun@user/k8yun) |
| 20:49:35 | → | acidsys joins (~LSD@2a03:4000:55:d20::3) |
| 20:51:05 | × | _ht quits (~quassel@231-169-21-31.ftth.glasoperator.nl) (Remote host closed the connection) |
| 20:51:37 | → | alx741 joins (~alx741@181.199.42.143) |
| 20:54:17 | × | alx741 quits (~alx741@181.199.42.143) (Read error: Connection reset by peer) |
| 20:57:26 | → | pavonia joins (~user@user/siracusa) |
| 20:58:34 | → | justsomeguy joins (~justsomeg@user/justsomeguy) |
| 21:04:02 | → | chomwitt joins (~chomwitt@2a02:587:dc04:5f00:97ff:5c76:a7e3:730d) |
| 21:06:38 | <Athas> | considerate[m]: great, thanks! |
| 21:10:57 | → | alx741 joins (~alx741@181.199.42.143) |
| 21:12:43 | × | mikoto-chan quits (~mikoto-ch@213.177.151.239) (Ping timeout: 272 seconds) |
| 21:14:17 | × | alx741 quits (~alx741@181.199.42.143) (Read error: Connection reset by peer) |
| 21:14:50 | → | jtomas joins (~jtomas@210.red-88-24-179.staticip.rima-tde.net) |
| 21:19:29 | → | cosimone joins (~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20) |
| 21:27:16 | × | DNH quits (~DNH@2a02:8108:1100:16d8:682c:7604:30f7:a4ea) (Quit: My MacBook has gone to sleep. ZZZzzz…) |
| 21:31:12 | → | alx741 joins (~alx741@157.100.197.240) |
| 21:34:18 | → | acidjnk joins (~acidjnk@p200300d0c7363f90cc2edb7570cac520.dip0.t-ipconnect.de) |
| 21:35:35 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 21:38:12 | × | jtomas quits (~jtomas@210.red-88-24-179.staticip.rima-tde.net) (Ping timeout: 240 seconds) |
| 21:38:28 | → | pareto-optimal-d joins (~pareto-op@2001:470:69fc:105::1:b61f) |
| 21:39:54 | → | Guest80 joins (~Guest80@47.186.214.206) |
| 21:40:17 | × | Guest80 quits (~Guest80@47.186.214.206) (Client Quit) |
| 21:41:17 | <pareto-optimal-d> | Does anyone have opinions on "Sums of data types" versus "bucket" data types with a thingType field? |
| 21:41:17 | <pareto-optimal-d> | Longer explanation/note: https://www.paretooptimal.dev/sums-of-data-types-should-be-preferred-over-bucket-data-types-with-a-thingtype-field/ |
| 21:42:18 | → | little_mac joins (~little_ma@2601:410:4300:3ce0:14ec:228f:c3ec:ab2c) |
| 21:44:18 | × | gehmehgeh quits (~user@user/gehmehgeh) (Quit: Leaving) |
| 21:46:26 | <EvanR> | sum types are cool and are basically the same as union + tag but more ergonomic. Literally using sum of types (nested Either) is unwieldy, at least in haskell |
| 21:46:44 | <EvanR> | though anonymous sum comes up sometimes not sure where that is |
| 21:47:07 | → | jtomas joins (~jtomas@210.red-88-24-179.staticip.rima-tde.net) |
| 21:49:22 | <ski> | i suppose by "sums" they meant not just `Either' |
| 21:50:33 | <ski> | pareto-optimal-d : in the second alternative, why are there `freeUserType' and `paidUserType' fields ? |
| 21:52:08 | → | alx741 joins (~alx741@157.100.197.240) |
| 21:53:00 | × | takuan quits (~takuan@178-116-218-225.access.telenet.be) (Remote host closed the connection) |
| 21:53:50 | → | vorpuni joins (~pvorp@2001:861:3881:c690:d322:f659:136d:eef6) |
| 21:54:52 | <ski> | pareto-optimal-d : also, in the second alternative, the `case u of ...' should presumably match on `Paid pu' and `Free _', rather than `PaidUser pu' and `FreeUser _' ? |
| 21:54:52 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 21:55:28 | <pareto-optimal-d> | Agh, i'm sorry I didn't catch those when reviewing after writing |
| 21:55:31 | <ski> | and the `case articleType a of ...' makes no sense, since there is no `articleType'. presumably uou meant `case a of ...', matching on `Paid _' and `Free fa', rather than on `PaidArticle _' and `FreeArticle fa' |
| 21:56:03 | <ski> | (oh, and you had two distinct `Free' and `Paid' data constructors, so you should either rename, or add module qualification) |
| 21:57:48 | × | justsomeguy quits (~justsomeg@user/justsomeguy) (Ping timeout: 240 seconds) |
| 21:59:18 | <ski> | considering the third alternative, it is basically `User = Int * String * (1 + Int)'. if we ignore the (basically useless) `freeUserType' and `paidUserType' fields in the second alternative, then we can see that this alternative is what you get, when you distribute the multiplication over the sum, in the third one : `User = Int * String + Int * String * Int' |
| 22:02:19 | <pareto-optimal-d> | Updated the mistakes, thank you. |
| 22:02:24 | <ski> | this whole thing is reminiscent of attempting to represent `Maybe T' by `Bool * T'. but with that representation, representing `Just t' as `(True,t)', you get useless "slack" when representing `Nothing' as `(False,t0)' for some faux `t0' value. you allow data in your representation that is useless, can be used by mistake, and may be hard to conjure up |
| 22:02:49 | <ski> | (`Maybe T' is of course `1 + T', while `Bool' is `1 + 1') |
| 22:03:20 | → | cynomys joins (~cynomys@user/cynomys) |
| 22:03:39 | <ski> | (this ties into the "correct by construction" notion) |
| 22:04:39 | × | deadmarshal quits (~deadmarsh@95.38.113.80) (Ping timeout: 272 seconds) |
| 22:05:11 | → | jgeerds joins (~jgeerds@55d4b9df.access.ecotel.net) |
| 22:05:18 | × | Topsi quits (~Tobias@95.33.25.255) (Ping timeout: 256 seconds) |
| 22:07:42 | <ehammarstrom> | I have just been introduced to fused-effects and written a small program that composes some effects, namely a logger (glorified putStrLn) and file reader (glorified ReadFile with errorhandling). What is good "effect" design? As I see it the vocabulary of an effect could be _really big_ (Database Effect perhaps) since it's like a DSL of sorts (?) Are there any texts or fun libraries using fused-effects that showcase |
| 22:07:42 | <ehammarstrom> | a good practice/scope of an Effect? |
| 22:12:03 | <pareto-optimal-d> | Okay, thanks for your comments ski. I'm still mulling them over. If it helps the larger context that I had in mind here was how using database models as domain types can harm type safety. |
| 22:12:03 | <pareto-optimal-d> | This was a subproblem of that I was trying to solve and get feedback on |
| 22:12:36 | → | alx741 joins (~alx741@157.100.197.240) |
| 22:15:45 | → | merijn joins (~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) |
| 22:17:20 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 22:19:37 | × | cyphase_eviltwin quits (~cyphase@user/cyphase) (Ping timeout: 240 seconds) |
| 22:24:45 | ski | . o O ( "Using Algebraic Datatypes as Uniform Representation for Structured Data" in 2003-03-17 at <https://ofai.at/papers/oefai-tr-2003-07.pdf>,"Modelling Large Datasets Using Algebraic Datatypes: A Case Study of the CONFMAN Database" in 2002-05-15 at <http://www.ofai.at/cgi-bin/get-tr?paper=oefai-tr-2002-27.pdf>, both by Markus Mottl ) |
| 22:24:57 | <ski> | pareto-optimal-d : ^ might perhaps be interesting |
| 22:25:37 | × | vorpuni quits (~pvorp@2001:861:3881:c690:d322:f659:136d:eef6) (Quit: bye) |
| 22:25:46 | → | steerio joins (~steerio@aviv.kinneret.de) |
| 22:25:56 | → | vorpuni joins (~pvorp@2001:861:3881:c690:d322:f659:136d:eef6) |
| 22:26:17 | → | DNH joins (~DNH@2a02:8108:1100:16d8:682c:7604:30f7:a4ea) |
| 22:26:19 | × | vorpuni quits (~pvorp@2001:861:3881:c690:d322:f659:136d:eef6) (Client Quit) |
| 22:26:29 | <jackdk> | ehammarstrom: I'm not aware of anything specific but off the top of my head, I'd expect you'd want high-level effects determined by your domain: input this, output that, high-level ops against a datastore. interpret directly into IO, or perhaps an intermediate representation if you need to test at that layer: perhaps you interpret your datastore effect into either postgres or sqlite, and from tehre into IO |
| 22:27:09 | <jackdk> | The demo starting at https://www.youtube.com/watch?v=-dHFOjcK6pA&t=240 may give a good flavour. It shows the effect-system dream, certainly |
| 22:27:15 | → | cyphase joins (~cyphase@user/cyphase) |
| 22:28:04 | × | jonathanx quits (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) (Remote host closed the connection) |
| 22:28:24 | → | jonathanx joins (~jonathan@h-178-174-176-109.A357.priv.bahnhof.se) |
| 22:28:45 | × | zincy_ quits (~zincy@2a00:23c8:970c:4801:39f9:90f7:922:e73b) (Remote host closed the connection) |
| 22:32:27 | × | burnsidesLlama quits (~burnsides@dhcp168-012.wadham.ox.ac.uk) (Remote host closed the connection) |
| 22:35:15 | → | alx741 joins (~alx741@157.100.197.240) |
| 22:37:31 | → | deadmarshal joins (~deadmarsh@95.38.118.170) |
| 22:37:49 | <pareto-optimal-d> | ski: interesting indeed! I'll add those to my reading list. |
| 22:42:08 | × | deadmarshal quits (~deadmarsh@95.38.118.170) (Ping timeout: 256 seconds) |
| 22:43:00 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 22:44:51 | <pareto-optimal-d> | <ehammarstrom> "I have just been introduced to..." <- I remember some discussion on keeping effects small and a bias towards reusing existing effects last I researched this. |
| 22:46:24 | × | lottaquestions_ quits (~nick@2607:fa49:5041:a200:b668:8e8:f292:8d7c) (Remote host closed the connection) |
| 22:46:49 | → | lottaquestions_ joins (~nick@2607:fa49:5041:a200:11a4:6cdd:1796:d5ed) |
| 22:50:04 | × | merijn quits (~merijn@c-001-001-027.client.esciencecenter.eduvpn.nl) (Ping timeout: 256 seconds) |
| 22:50:11 | → | ofl^ joins (~ofl@50.233.120.162) |
| 22:52:20 | × | ezzieyguywuf quits (~Unknown@user/ezzieyguywuf) (Ping timeout: 256 seconds) |
| 22:53:47 | → | fendor joins (~fendor@178.165.200.21.wireless.dyn.drei.com) |
| 22:54:13 | → | ezzieyguywuf joins (~Unknown@user/ezzieyguywuf) |
| 22:55:17 | × | CiaoSen quits (~Jura@p200300c95737a2002a3a4dfffe84dbd5.dip0.t-ipconnect.de) (Ping timeout: 240 seconds) |
| 22:56:44 | × | acidsys quits (~LSD@2a03:4000:55:d20::3) (Excess Flood) |
| 22:57:18 | → | acidsys joins (~LSD@2a03:4000:55:d20::3) |
| 22:59:08 | × | polezaivsani quits (~polezaivs@orangeshoelaces.net) (Quit: rcirc on GNU Emacs 27.2) |
| 22:59:13 | × | fendor quits (~fendor@178.165.200.21.wireless.dyn.drei.com) (Quit: Leaving) |
| 23:00:37 | → | alx741 joins (~alx741@157.100.197.240) |
| 23:04:52 | → | burnsidesLlama joins (~burnsides@dhcp168-012.wadham.ox.ac.uk) |
| 23:10:28 | × | burnsidesLlama quits (~burnsides@dhcp168-012.wadham.ox.ac.uk) (Ping timeout: 256 seconds) |
| 23:12:02 | × | cosimone quits (~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20) (Read error: Connection reset by peer) |
| 23:12:48 | → | cosimone joins (~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20) |
| 23:15:12 | × | modnar quits (~modnar@shell.sonic.net) (Quit: No Ping reply in 180 seconds.) |
| 23:16:25 | → | modnar joins (~modnar@shell.sonic.net) |
| 23:16:26 | → | lavaman joins (~lavaman@98.38.249.169) |
| 23:22:01 | × | michalz quits (~michalz@185.246.204.33) (Remote host closed the connection) |
| 23:22:25 | × | zer0bitz quits (~zer0bitz@2001:2003:f74d:b800:34e0:8b74:dd2c:1d62) (Ping timeout: 256 seconds) |
| 23:23:09 | × | cynomys quits (~cynomys@user/cynomys) (Quit: Lost terminal) |
| 23:23:49 | × | bontaq quits (~user@ool-45779fe5.dyn.optonline.net) (Ping timeout: 272 seconds) |
| 23:24:58 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 23:24:59 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 23:25:10 | → | lavaman joins (~lavaman@98.38.249.169) |
| 23:25:48 | × | eggplantade quits (~Eggplanta@2600:1700:bef1:5e10:5928:8400:a51e:7799) (Remote host closed the connection) |
| 23:29:05 | × | cosimone quits (~user@2001:b07:ae5:db26:c24a:d20:4d91:1e20) (Quit: ERC (IRC client for Emacs 27.1)) |
| 23:30:45 | → | wroathe joins (~wroathe@206-55-188-8.fttp.usinternet.com) |
| 23:30:45 | × | wroathe quits (~wroathe@206-55-188-8.fttp.usinternet.com) (Changing host) |
| 23:30:45 | → | wroathe joins (~wroathe@user/wroathe) |
| 23:43:10 | → | alx741 joins (~alx741@157.100.197.240) |
| 23:46:26 | × | chomwitt quits (~chomwitt@2a02:587:dc04:5f00:97ff:5c76:a7e3:730d) (Remote host closed the connection) |
| 23:46:39 | × | alx741 quits (~alx741@157.100.197.240) (Read error: Connection reset by peer) |
| 23:54:16 | × | lavaman quits (~lavaman@98.38.249.169) (Remote host closed the connection) |
| 23:57:17 | → | thyriaen joins (~thyriaen@dynamic-078-055-141-021.78.55.pool.telefonica.de) |
| 23:58:54 | → | eggplantade joins (~Eggplanta@108-201-191-115.lightspeed.sntcca.sbcglobal.net) |
| 23:59:08 | × | DNH quits (~DNH@2a02:8108:1100:16d8:682c:7604:30f7:a4ea) (Quit: My MacBook has gone to sleep. ZZZzzz…) |
| 23:59:52 | → | DNH joins (~DNH@2a02:8108:1100:16d8:682c:7604:30f7:a4ea) |
All times are in UTC on 2022-02-19.