 All right, welcome to the stream Haven't checked this out for a while, so I hope the settings are okay Got a new microphone now, it's running into an actual audio interface Which is cool. It's like a mic pre-app processor, and I'm actually just using the Loopback function of my audio interface so what I hear is what you should be hearing and Yeah, just let me know if it sounds okay, and Hope you like some lo-fi music I'm gonna be Working on a bug that's been there for Yeah, a year ago by Matt Pickering Saying valid outfits are too slow to be enabled by default So the way we're gonna do that is Is First of all, we're gonna we're gonna try and skip Completely unconstrained holes that is you know if just everything in scope matches the whole that is That's not very useful, right We're gonna try and figure out like when is a whole when is the type completely unconstrained and We're gonna try and see if we can We can kind of detect that and fix it, right? The other trick we're going to try a Yeah, so It's from ISO vector, right? It's like he's doing a custom case. So yeah, I mean it's very if If type checking is doing a lot of work And we're trying to type check again as everything in scope. It's gonna be It's gonna be bad, right? So that we're gonna see if we can fix that a bit and then Let me just dial down the compression a tiny bit here Let me know what the sound sounds okay, because I mean I hear it in my ears, but that's I can also hear myself talk right So Yeah, let's check out Like I also have this new green screen Mat thing here Like you see the mouse and keyboard and Yeah, I hope it's enjoyable. All right. So this is a bug. We're trying to fix They're too slow the some suggestions here have been We want to guarantee that they're quick So some people say that we should just not have valid outfits by default, but I mean obviously I think that's a bad idea. I mean a lot of people because you know, you really have to They have to kind of be there as Just by default right for beginners and stuff, right? So we're gonna try and make them so that you know, they don't need to be disabled by default, right? Um Yeah, hi Yeah Disabled whole fifths for unconstrained holes. I like that and Yeah, all right, so we got a good test here at least just say I'm gonna check the chat Hello chat All right shows up And then we have alerts up here Yeah, hi. Hey, this is a test. We're gonna be working with and Let's see what happens. I think I'll I'll change To the percent mode here make it the default That was the one I was using the other day Yeah, I have to say right Little bigger fight. So go to GC Let's check out master we are pulling the master I was working on a fix Not too far back so Yeah, I'm hoping we won't take super long to actually Actually get up to speed again, but yeah, I'll see Right the name Ain't not them. Hope you enjoy some G.H.C. development What is the type checker really doing? Huh? Should all match up, right? Oh, oh What is this? I mean G.H.C. development isn't too bad But then I mean it's a lot of junk under the hood, right? that That you kind of I mean you wouldn't expect to be there because it's like a pure language and you're like, oh, it's gonna be all pure and nice but To make it fast you just kind of Alright, what is going on and get reset? It is All right, this is the first part of development right is actually getting it and making it feel And I thought Okay, here we go. I think I have to do this. Yeah Okay, and then All right, let's just see if this actually builds. How do we do this again? We went to the Haterian Bill, right? Got Haterian Bill Okay, it's been a couple of weeks since last I always remember forget like the exact thing The exact things that we do But yeah, that's good Um thing is that you know, I'm trying to Make valid all fits fast, right? So I want a Like a representative speed and I'm guessing kind of flavor quick will not do as much optimization But I have no idea what flavor quick does actually Yeah Do-do-do-do-do Yeah Good to have someone in chat because you know, we're gonna be doing a lot of Waiting for ghz to build right Um Right So let me check you out. I mean it usually doesn't take too long. I'm worried that you know because I'm Also running the stream. It might be even slower But the stream is usually like mostly gpu dependent, right? Uh, and you know, I wish but we're not using gpus to build ghz, right? So See this water bottle. I love this water bottle got got it sent from um Uh gene yang so I helped gene yang out with some um Some akira stuff you sent me a hascon water bottle How on brand for the stream, huh? All right, let's say while this is going Let's actually see if we can Get started on putting the tests there, right? Um I always forget how we do this. So uh what I usually Okay, so we have a test case here. Yeah, let's go to I think it's uh Test sweep then test and then because they've been reorganizing, right and they've been moving things around Okay, I'm just going to get crepe uh for typed homes, right? Here we have where do we So there's a ghci scripts and there's type check check compile Yeah, this is yeah, it's always in type check Type check just compile so um Now we want to write a new test uh then uh hard Now we set phase and we just paste this in In this Folder, there's some runner, right? So give grab valid All It's um All dot t right, okay. Hey, I don't think I added this myself But uh, okay. All right. Uh, so we're just gonna comfy paste And extra files Now we don't need any extra files here Okay, let's uh Actually just go here into the local whole fits. I think that is Just what we need Um Hi, little lanny valid hole Hard hole. How is the build going? Let's just see what happens. Okay. Uh error When building Shake room builds no generator for underscore build Stage zero Okay, I think this is because And yeah I just always run boot and configure. Okay And then yeah, because I might have to you know, because I last built like 130 commits ago, right? um So it might have like changed in the meantime so much that I just have to kind of And you get right Let's see At least we have the uh test there And then I there is like some flag I can write that just kind of makes it just run that test right so we're gonna We're gonna see how long it takes and And we're gonna Now we're gonna see what happens Okay, it doesn't crash immediately. That's good Very good Boom You want to hear my keyboard mic? Oh, what you can mostly hear is A fan on my computer going Urgh You know if you need cheap heating you just Start compiling jc Gonna turn that microphone down I should like mount it like right above the computer if just just have like a fan mic Yeah, exactly. So I think then we write the Like Hadrian test only and then the hard home fits And then we just see what happens, right? Beep beep Remember stay hydrated folks Because I always forget to drink water Um, but my trick is to have like a big water bottle right In front of me, right And then uh, it's hard for me to forget it Okay, um, so here we have the tests. Okay, let's let's open it yet another window and let's just start um Looking at the actual look at the actual Code we're gonna be looking at Wow, thank you shf Very big alarm um CD compiler Because they also yeah, they changed everything, right? DC Why does it just say not to miss now? Oh, wow subscribed. Wow. Thanks, Adam. Wow Uh, all right, let's go I think it's an errors and the whole yes. All right. So the actual code is here um Yeah So what do we want to do first of all? Here we have a the whole tie, right? And we want to see If it's unconstrained So what we're gonna do is essentially, you know when Um, what we're going to do when this is actually built. I mean it's still running, right? um We're just gonna run it and build it again. So it won't have to build the stage one, right? We'll give it the freeze stage one flag, so it's not gonna take 10 minutes and uh I mean, this is very send though, right? You can just Look at a bunch of nice text outputs scrolling by I mean you just sit there and you're just talking, right? But you feel like you're doing something You know, you remember the classic xkcd, right? My code is compiling This is not my code, but it is compiling, right? All right, uh Once you see this scroll by it's usually Not too bad, right? Okay, um so What will a completely unconstrained The whole type look like so we don't actually have to do this in gac, right? So Uh, because I mean we're just waiting for gc to compile. Let's Go into dynamic Haskell plugin And in the dynamic Haskell plugin No, we don't actually write any homefits, right? Uh, let's go to follow up because I was talking about this in my You know, I follow up meaning so here we have a plugin that takes in a home fit plugin, right? And the whole fit plugin actually gets past the actual home Right, uh, so this module so this module actually takes in the type home Um, so we're gonna say you're And then we are just gonna say Do and we're gonna say ppr panic Type home okay ppr home Okay, and yeah, we're just gonna write in gac i test plugin and it's going to compile We set f plugin equals test plugin And then we say underscore Okay, a Yeah, okay, so this is actually not quite the same because it is an isle Okay, and So we should write here test file And here we write a options f plug Test plugin And here we just write underscore Stir Okay, and then we say just f with no type Have people underscore Okay, let's see if we can actually compile test Okay, it actually does say compiling test plugin This is bizarre, right? Uh, normally you wrap these things up in like a Compile package, right? And then they know about each other Um, we write doing this way Okay, um Let's see I just initialize cabal right here, and then we can just yeah, just put it all in the same place Um, and okay, let's just write test plugin and then Okay, and let's now come on bill. Let's see I don't think yeah, okay, I think it's because it will say that follow up cabal Yeah, it's still running. Um, I think I see here Oh, what is it called? What is it called additional? Exposed modules Exposed module you hear that sometimes when I talk and the fan is going really hard That bleeds into the noise might need to do something about that Uh Okay, I will just Okay, let's see. Uh, yeah, okay. Yeah, I don't feel Yeah Yeah, yeah, yeah, okay. Yeah other modules But just it's just not finding This is a weird thing going on here, right? Let me just go then to our repository where I know it works So here we have a plugin going already Uh, go to a new branch And let's go to the plugin. This is all stuff Um, and here we have a whole fit plugin. Yes. Okay. Um Okay, and what we want to do is with whole Let's just return f ppr panic ppr h return f Test ifc Uh, I simply okay. Uh, here I have off on it the Plugin and everything is good. Okay. Um, so this is work Yeah, I feel actually compiles. I mean, I did leave everything and maybe that killed something We'll see. Okay All right. Yeah builds and of course because there is no typed hole We'd actually actually do anything. So let's say f And we build it Okay, and the typed hole says implic level scolum. No True status unsolved given Wanted okay, so you can see that it has a scolum And the entire type is just the scolum. So let's inspect this a bit more Do do do so I so I mean and that sounds let me that's makes sense, right? So we have a Completely unconstrained type variable, right? That is just the scolum This is a Di H uh f and then a what is in scope for typed holes Uh relevant cities in place and then the hole itself So we know we have a hole. We will have the hole a How what is the th hole? Let's see. Uh, I think it's actually not th hole anymore In this version Let's just say ppr underscore, um dollar, uh Is just and then underscore and then it will actually tell us The one in scope, which is a maybe which is gonna be a hole Doop, do this is detective work, right? Bum bum bottom Uh thigh hct, right? Yeah, I changed names between between stuff cd equals just thigh Just ct and then I also want the influx Let's print out the ct and the influx Right. No, it's probably not thmx thigh h thmx I forgot how it was in gtc 8.10 4 package gtc 8.10 Go here And do the docs. We find a type of visual errors 2 2 2 2 2 thigh hmx Exactly. See what happens So the hole is um It's completely uns constrained type variable, right? Cause I think I have some This is taking quite long, right? So um Cause I think I if I remember correctly I like build The type with the relevant influx Mm-hmm Let's just recognize Relevant CTs is very good PC Where do I actually Instruct it with the types Besides so I mean the trick is here, right? So if I have um F Show A, right? I mean here the influx will like I mean it will look the same I mean it will look the same Right? But like it will not have any relevant givens Right? Um actually let's uh Let's not do it this way Let's say hc over fun hc root root f Where I need to rewrite fun fun ih Uh Just do lift IO Donor Uh show Usually just put string ln Show S.unsafe Donor PPR, Donor CT This is will be the imps And then I return Okay let's see what this does This is applied with the same implication A lot of errors a little indentation Can cause, right? Eh I don't actually care about the fits here Fun is played to for your argument Fun is of type All to keys Right let's see what happens How do you plan on addressing suggestions Like id underscore in a case Where the whole is actually constrained I mean so those only happen In the abstract refinement whole fits, right? Um so we will have to We'll have to see, right? Uh yeah I'm not quite sure What we can do there, right? Um I mean one One route would just be saying If you're going with the If you want refinement whole fits Are you gonna be mad that it's A bit slower But that maybe that's a cop out, right? Uh we'll have to look at What the actual types involved there are, right? But I mean the trick is that we We actually build An entirely unconstrained type variable And then We suggest a function of that type, right? Um We could have a look, right? You know If um Maybe we should like check that the So I think what will happen there is that Um It will probably So I think the type checker will During type checking of id underscore Um I think it will Unify the type variable with Something In the case of something interesting, right? But otherwise It will not Um I mean that is also like Another point, right? Um You know Here, right? Like you know Because we can always suggest head underscore Um Um you know we can always suggest You know id Of underscore Um we can always suggest You know head of underscore Kind of just Um you know put it in a list Somehow and that's uh That's uh That's not very useful, right? I mean we'll have to see Um but yeah definitely We can make that useful that will be very good, right? But I think uh I'm not gonna finish this tonight, right? Yeah exactly If a list with the appropriate type is in scope But um We don't really Check that, right? So we don't uh You know we don't recursively check That um Yeah I mean so that would be a lot More work, right? You know like check Check if the home would work, right? And then if you Find a kind of relevant fit Then you would Check whether anything in scope has that type I mean because I mean because Okay so what I'm saying is you know If I have head underscore Right and that would be A relevant fit if There is a list in scope Which has the correct type Right but In order to Detect that I actually have to look I have to check everything in scope And I have to see Um Can it match The type of the home Right so I can't go from You know Type to everything in scope of that type I always have to Give it an identifier And then the type checker has to check Can I solve this constraint Um And that is especially You know That becomes very hard Especially when you have like very hard dependent types Right or Very hard constraints to solve Right Because it's not just that you know Something which matches the string That could directly fit I mean that's what hugul does Right and hugul works fine Right but hugul really only Only checks for these strings Right whereas The valid hole fits there The actual Um Running the actual type checker To see if it actually fits So I think Maybe we'll save that for later Right so what I'm Trying to focus on now is you know Because valid hole fits are enabled by default Um So because they're enabled by default They should be faster right Um And then I think Another patch or bug fix right Making abstract refinement hole Fits more useful And faster Right Because it's, otherwise this would be Very hard right Okay So here we have fshowavay Right And then we have f2 Okay so No this one is actually not good Right we want show of underscore We don't so what we did previously So we actually we gave the type variable name Right And that's why it had Why does it now give it We got like a more Funky type before right But it was like a weird Skolam right Why is it not doing that anymore Maybe that was just ghci There we got the io1 right Oh right So you see here it says Show sdoc unsafe right But if I do ppr panic Ppr Trotter Ppr a Ct, imps So what happens there is that It becomes less funky because It's gone through Show sdoc right and show sdoc Will actually sock things Right see So it shows it that it's t But it is actually You know Proper skolam Because we We don't want to sock it right Yeah so ghci is still building But yeah it's good we can be Kind of figuring out what we want to do While it's While it's While it's building right Okay let's see So I think the trick is that You know they're completely unconstrained So if the type of the whole Is one type variable Right And that type variable Is not mentioned By any of the Givens Or Okay so Oh yeah so the Givens came from the The Givens came from the Yeah So here we will actually use the relevant constraints Right We have here Relevant Relevant CTs right so we will take The type Right and we will take the The other Wanteds right And And If If the type Of the whole is not mentioned By any other Wanted right That means that there is no Constraint On that whole right because there's no Other constraint mentioning that whole Then it's completely unconstrained Right So it's going to be unconstrained If There are no relevant constraints Right that seems That seems good right Seems like it's Exactly what we want right Let me see Do do do do Do do Do do do do Can you hear that It was like Do Anyway I'll have to see what I can do about that Didn't really set this up with my fan going right Maybe it sounds okay Alright So we have here Okay so So now we will actually Copy over The relevant constraints Because So they're exported in the current version Of GAC Or actually not the current version but like If you go to like a recent enough GAC Like I think 9.0.2 Relevant constraints will actually be exported But currently they're not exported So we Will see here Okay yeah let's wait Maybe Type B We'll say That will be Then we would have to search For Everything in scope but That is not a completely unconstrained whole Right there is a constraint there So it's very hard For us to detect Whether Whether a constraint is trivial Right But you see what I mean right that That if we had this case then Um We would not actually have let me open this We would not actually have like a completely unconstrained whole right Copy it Yeah I mean so Here you're saying kind of unconstrained right And then Then we need like to define a metric Of What What does kind of unconstrained mean Right I have to Enable all the language extensions Language, a rank and Types Scoped type Very operators I think that's it Scoped type variables Very bails Variables Right this needs to be Yeah Let's just see what we end up With here God damn it Okay a GADDS Okay and Yes So show enough to And then here This is the second one Okay So that's a trick here right I mean here I'm not sure we're doing this correctly right Because I mean we're not getting We're not getting all the fits Right You know what I mean like we're not actually It's not actually Showing everything in scope right I mean so yeah so address this one Right I mean this is not Even completely unconstrained Right It's um I mean we have Full here and we have B Right so and they have the correct type So I mean I mean it doesn't make sense but we could kind of Recursively call it or something Like that um but yeah So I'm not sure we can deal with these cases Now I'm wondering like what Does it even mean Because we see these cases right like These completely unconstrained ones Okay let's Import All of these Then we just say A equals underscore Right no I need Test ifc and test a cabal Easy Prim Okay so they're saying that this takes Four minutes Is it just not doing it for me Yeah exactly I mean so I agree I mean this is something That's definitely an interesting case Right But Let's see if Like making the other thing just work Is good enough right and then because this is like This is additional logic And that's more code And that needs to be maintained and then it's a bit Bit hard to get To make a case for So here Here's what I don't get right Okay so now I have this module Right okay Test ifc Test.hs right I have this module And I'm doing The same as Adam Gunnery right Why does this take A second to compile Okay I really need to Cabal, build, test Okay yeah So this takes a second and a half to compile And then if we do F no Show valid Okay so now It takes User 1.3 seconds And with no show valid It's taking I mean there's not a huge difference here right Yeah I'm gonna have to think a bit About how to actually test this Right Adam is Also I mean yeah It doesn't really work For me to test it this way Because What do we have Import data.list Import data.maybe Import Map I need to add containers Let's add GHz Here And let's import that as well Right What do I import here And GHz plugins something like that right Yeah Let's just import all of these Yeah I just don't want to have to Download something and build it right These are all kind of included Okay I'll get them all Now what did you import Just import Vulkan Okay let's see See what's going on Downloading, starting Let me just snap Doesn't seem to have a lot of dependencies that's good But I hope To I think this is actually Not a very important password And we're 47 minutes into building GHz I mean we've been doing other stuff In the meantime It is quite heavy to build right We're doing TC Stage 1 right It's not too bad See if that was enough So I think this will be a problem Right because I'm running it on VSL2 And And it doesn't Actually have It doesn't actually have It doesn't have GPU Acceleration yet right So I'm not sure Which one of those Yeah exactly Let's see how long this one takes I'll try to do it again I think that's tricky D D D D D I'm just gonna Okay like this Yeah like this Okay now let's build and see Yeah so this is also an issue because they changed The names of everything right I think this One was called Which is expert Oh there's a nice Yeah I mean so it happened after this one right So it actually So in here the Language Haskell syntax Didn't happen right So what I usually do Is that I Okay but this one took 10 seconds right 10 seconds is the first time Maybe if I import this then Language Haskell has syntax expression Okay Google that Little source But it wasn't complaining that it like Was missing a package right As I said like member of the hidden package So what I will do What I was trying to do Is I'm going to It grab This string and then we're going to In Computer Language Haskell HHS And We see that it has What does it export Okay it just exports everything So we find something in this file I like HHS app and then we Look for HHS app on Google because Google is a little On the old system In HHS.express Yeah I mean it's just not taking It's just Not taking that long Alright Okay now I'll just What if I just copy paste the Entire thing Should have 3 arguments And then everything Change of course HHS part Okay now it's going slow Which is good Okay it's going slow and we can see that I mean these are not Unconstrained holes right These are holes Which should be an int Right And it's still going pretty slow Alright we got GHC built I think Hadrian was smart enough to like freeze it What does it want Hadrian flags Let's see Yeah freeze one Okay nice Free This is the one we want to be figuring out right Yeah Okay I mean it's just doing freeze one I haven't changed anything It takes 20 seconds Okay let's see Can I do like Hadrian Test How do I do the test again Yeah okay just write Hadrian build test Only Hadrian build Now we have to say I mean because The Hard hole fits test doesn't have Any error Let's see what happens Okay but these were not Not unconstrained at all Check the plugin Let's see how many fits We are checking here Candy8 Oh yeah this is the Fit plugin I actually want to be looking at the Can't plugin FunHC Okay so now we're checking 2254 Candidates Right Okay and It doesn't work Because How do I require How do I require Set package Maybe I can just say that In the In the thing Let's see Turn the music out A little bit How do I do accept Well Okay Test the way I will do test accept Yeah And then it will save the new file But we actually How do we set the timeout for the test Because now we want to do like a Perf test right Let's see It seems good Where was this timeout Second argument After After three seconds So if it takes longer than three seconds Which is We'll fail right Expected passes Okay that didn't work Make it 300 milliseconds Okay nice Timeout happened Yeah So let's actually Change this to something Like a second 300 milliseconds Yeah okay Let's try and make it happen Under a second Do do do do do Do do do do do do Because you know This was First written right We don't really consider The concept of Multiple holes Right Because what we actually see that we just see we just see each home as it comes right which is why also like we don't have any we don't have any cash right we don't have any so like in this example right it's checking for ints again again again again right let's see how long does it take to compile so this one took all right let's see that here right let's take 13 seconds um but if we do have no show valid home fits let's just see how long this thing i'll build it again because we're actually okay so that took two seconds so you know that would be really nice as hf but um but i'm with what i'm worried about there is that i mean then i have to mess with the hie files right because i want to try and do this in like a non-invasive way right so you know it would be really nice if we could just place stuff in the hie files right but then um then the typed home fits are kind of taking up a lot of space and uh you know i'm trading in other other people's territories right i mean which might be okay right but then i have to argue for it so let's see if we can make it make it nice right um i'm gonna give this about 20 more minutes today um because it's getting quite late here right uh let me see i will also fork ghc again and go to my forks and then i what i have to do i already have my fork here right no this is not the get status okay get check out v fix and this one is 16875 16875 status get add test we test type jack should should compile get status commit am add add timeout test for hard home fits wait what was the branch called again yep get push remote get push fork fork fix 16875 set upstream just to have the have this here and then you can also check it out if you want right okay um so to optimize it for multiple holes we could have some sort of cache right and to see uh see what happens compiler gc error tc errors i got hs okay and this is cabal no this is adrian build test only equals hard home okay this is what we're going to be doing i think i'll need to to so first we just need to check right we just add a flag and if we have too many candidates we just don't try right okay we do this after the candidates have run right so that you know we have too many but you filter them out that's okay right uh if the length can you know here we would and limit get that from the dynamic flags of course this is not in the dynamic flags just yet so we just say if the there are more than the if there are more than the limit then okay so the trick here is that you know people might write fit plugins right so we actually want the whole all the things to run we just want it to be do not run um they're just just have no candidates right okay so we will say here cans okay it goes to do uh base uh base cans and then if a length can then uh this candle it will be something we say you know it's 500 by default or you know whatever whatever is not crazy right then uh turn it would be cool if we could you know um somehow sort the candidates based on likelihood right um and just say you know take the most likely candidates in this case right let's write that down should we try the most likely candidates are definitely you know the locals um right anyway if we limit it to you know a thousand this will definitely work right because it will just not do anything oh well it will actually return a different different output right yeah cans right just things base you know is it building everything again like it's building everything again maybe it's too late probably right freeze one i think i have to say freeze one to test also okay same stage one that's good that is promising use a fine comb right let's see what happens now i think we'll see what happens now and i will just call it quits for today because it is quite late but i'll i'll go again have another go tomorrow evening so from maybe uh eight ish um swedish time see what happens and i'll be at it for you know a lot more hours timeout happened again really i think this is what i thought would happen right it would return but it's it's still time timing out there which is bizarre right let's just see let's just ppr panic check my phone while compiling let's see let's see what's going on so otherwise um it's always timing out right let's give this something better three seconds it seems like it's not evaluating their branch right um yeah maybe that would be very weird though because it's just it it's just taking the data that's already there that i mean that is a good point right and if we can fix it without having to mix with the type machinery that would be great right yeah okay now we right okay so we only have 537 candidates here but it's still it's oh right yeah okay so in the yeah okay but yeah let's check out that um that theory right so now we saw how long it took and now it should take much slower right so now we we're checking uh under under a second yeah okay and we still hit this case right but it's just that this can't limit it's too low i feel like you know just in the prelude there are more than 200 functions right let me see how many there are just in the prelude okay i mean there's 200 candidates in the prelude i mean okay and this is for an unconstrained hole right so for an hint it's not too bad right half of a half a second but for and now it's half a second again okay um i mean yeah i don't know is it really been is it is it really taking half a second just in the prelude with one hole we need to make that faster right because i feel like i've seen that these times being way faster right of course this is you know this is not i mean it's not the hole itself right so here we are searching for three holes and then it's only taking like 623 right let's search for 10 holes because we otherwise we're just measuring uh the time it takes to do everything right okay 10 holes it takes a second what if i say f no show valid hole fits it takes 350 seconds uh point okay so 10 holes take 700 milliseconds right so each hole takes 70 milliseconds so for 200 300 candidates each hole takes 70 milliseconds of course it's you know not yeah yeah so this is so if you have 10 holes and it's just a prelude it takes 70 milliseconds right to check all the fits for that hole and the entire prelude takes 70 milliseconds to check if you import all the stuff atom gun re-imported then it took longer per one hole right we have to be very careful with time measurements here so it's one second minus so it's like yeah 200 milliseconds okay i think i think we'll stop there today because it's like half past 12 and i have work in the morning um thanks for stopping by and it's i think it for especially for stuff like this where you're really trying to get a feel of what is good and what is not good uh it's very good to have someone else here right especially i really like you know we will throw in this this example here right oh no okay anyway with the with the we will think about we need to think about um we can so what have we learned so far we can uh okay let me open up city uh that's what i use to take notes give me a few seconds and uh here rename it a fixing 16 785 it's 875 whatever okay what did we learn uh okay now this is just this is not right here um what have we learned 10 holes for the prelude takes approximately 700 milliseconds more than with 5,000 each here i hope it's so each hole is 30 mils i don't have but i have just the prelude on average okay uh this is one thing we've learned another thing we've learned is that we can check for unconstrained holes by checking that there are no that uh that the uh type of the hole is a type variable with no relevant relevant relevant relevant constraints yeah and then uh yeah and then we have this one uh because i want to i want to throw this in there are example of almost unconstrained like here and then i'll do this hole has a equality constraint with an unconstrained uh okay uh skullum type variable um and prelude has 270 functions but the bad example of test uh has only 571 functions and the whole unit yet they take 10 seconds whereas the prelude takes a million seconds uh i mean these are yeah there are more holes though like uh maybe the the identifiers in scope have harder types that could be right maybe they have a bunch of constraints on them and we could somehow detect that and yeah um one approach is to check the best candidates by somehow sorting them before check okay i think this is what kind of we've learned so far about this bug and what we want to try and do let me actually yeah i think we should put this into ghc right uh compiler ghc ghc hold on just edit and let's just throw in a note here that we will probably throw out there but like just currently uh note uh okay and let's throw vip here and the issue is yeah exactly uh valid hole fits are slow as evident is you on six is 75 uh we are trying to figure out exactly and what we can possibly do about it what have you learned so far okay let's so this is was like uh let's put this in kind of order okay um all right so this is kind of where we are right now let me actually let me change this back to what it was then we can just push this with only the what we learned to fix and six it's 75 we should probably do something here saying here and see no okay and let me see get status gz dc errors let me just fix those uh trailing spaces and okay give commit am uh give status hit add compiler get status get these two staged compiler gz gz errors give commit vip and then this will uh i mean we will squash this all together um eventually right so we won't have the note and we won't have the vip commits or whatever all right you check out the note and the commits on the gz repository uh sorry we didn't make it very far today but you know but we're we're i mean we're trying to figure out learn right um you know it's not just like oh it's doing it wrong i mean it's doing the right thing it's just doing it in not a good way right so i think this we we need to explore a little bit here um what we can do and what we can fix and and how we do it all right uh yeah like i said i'll probably probably go at it again tomorrow um and uh yeah hope to see you there if you have time and thanks for showing up it's been really great having some company right otherwise i'd just be all alone thinking about it which is fine it's uh just more fun to have some talk to all right thanks for the stream and uh yeah hope to see you next time all right bye