- 35
- 75 984
Houston FPUG
Приєднався 16 жов 2013
Video presentations from the Houston Functional Programming Users Group. hfpug.org.
Richard Feldman, "The Functional Purity Inference Plan"
It’s common for imperative programming languages to announce that they’re adding some new features to support a functional style of programming in that language. The FP experience in those languages is never quite as smooth as it is in functional-first languages, but it’s still appreciated when that’s the style of code you want to write.
The Roc programming language, which has historically been a purely functional programming language, is planning to add some new features to support an imperative style of programming. The imperative experience in Roc will never quite be as smooth as it is in imperative-first languages, but there are some situations when an imperative style genuinely seems like the best fit for the problem at hand.
Some of the new features are familiar - a `return` statement, `for` loops, and opt-in reassignable variables - but the headline feature is “Purity Inference.” With Purity Inference, functions can be either pure or effectful, and the type system tracks which is which so you never have to guess. Both styles of function are called the same way, so there’s no IO/Promise/Future/Task wrapper. But that’s not all…for the full plan, you’ll have to see the talk!
The Roc programming language, which has historically been a purely functional programming language, is planning to add some new features to support an imperative style of programming. The imperative experience in Roc will never quite be as smooth as it is in imperative-first languages, but there are some situations when an imperative style genuinely seems like the best fit for the problem at hand.
Some of the new features are familiar - a `return` statement, `for` loops, and opt-in reassignable variables - but the headline feature is “Purity Inference.” With Purity Inference, functions can be either pure or effectful, and the type system tracks which is which so you never have to guess. Both styles of function are called the same way, so there’s no IO/Promise/Future/Task wrapper. But that’s not all…for the full plan, you’ll have to see the talk!
Переглядів: 2 373
Відео
Raúl Chouza, "Gleam - An Introduction to the Language and Platform"
Переглядів 1 тис.Місяць тому
Abstract: A brief introduction to the Gleam programming language, we’re going to talk about what makes it “click” as a language but also about the underneath platform/s that make it work. Currently, Gleam can be compiled to erlang or javascript which we can use to our advantage to put the computation where it makes the most sense Bio: While at a desk Raúl spends his time getting into rabbit-hol...
Jeffery Olson, "System R-A Practical Lambda Calculus Made for Extensibility in Rust"
Переглядів 1067 місяців тому
Abstract: This will be a presentation on lambda calculi, their differing varieties and corresponding expressiveness, and a particular implementation: System R-a lambda calculus, written in Rust, built for extensibility and practical use cases. Many programming languages (especially in the world of FP) we use today are implemented atop layers of academic theory modeled as lambda calculi. Advance...
William E. Byrd, "A New Relational Language"
Переглядів 3028 місяців тому
Abstract: I’d like to talk about a new relational programming language I’ve just started working on, attempting to combine the pure relationality of miniKanren with better control of search and constraint solving. In particular, the language should make it easier to implement efficient program synthesis algorithms. Following Kowalski’s famous paper, `Algorithm = Logic Control`, the language wil...
Eric Normand, “Four Domain Modeling Lenses”
Переглядів 3739 місяців тому
Software design is about making decisions within a complex, multidimensional space. Instead of relying on rules that cannot cope with the complexity of design, we should focus on seeing our software from various useful perspectives. Each “lens” will help you extract more information about the problem your software is trying to solve. That added information will help will help you make better so...
Christopher Bremer, “Let’s try Bolero, an F# web framework built on Blazor and Elmish”
Переглядів 46911 місяців тому
When my team decided it was time to migrate one of our web apps away from AngularJS [^1], Blazor seemed like a good fit. Javascript isn’t really one of our core competencies, but we needed a more robust client than, say, HTMX. One of the devs suggested we look into Bolero. We prefer F# for our technical applications, and we were already familiar with some of the design principles espoused by th...
Onur Gümüş: “Functional CQRS with Akka.NET”
Переглядів 21811 місяців тому
Abstract: In this talk, we will explore how to use Akka.NET and F# to implement a functional CQRS system that can handle complex business logic, event sourcing, and eventual consistency. We will also discuss the benefits and trade-offs of this approach, as well as some best practices and tips with real life examples. Bio: Onur Gümüş is currently a Senior Software Engineer at Microsoft, located ...
Ahmed Hammad, "Property-based Testing in F#"
Переглядів 102Рік тому
This talk discusses the benefits of Property Based Testing (PBT), an overlooked testing methodology. It introduces PBT in F# using FsCheck, emphasizing the importance of invariants in constructing effective tests. While FsCheck is the specific platform used, the concepts and principles presented are broadly applicable to any Property Based Testing system.
Jade Allen, "Erlang Timer Wheels"
Переглядів 106Рік тому
How can you accurately and easily scale events to trigger at a given time in a distributed system. This is a critical task for many asynchronous systems - Kafka for example has a timer system which helps it decide when it ought to next check its queues for new input. But there are other excellent examples of highly scalable and accurating timing systems such as the one implemented in the Erlang...
Jonah Beckford, "What distributing OCaml on Windows gave me (and you)”
Переглядів 430Рік тому
Abstract: I’ll talk about why I distributed tools to install and use OCaml on Windows. The talk will start with why I adopted OCaml, and why I took the risk as a newcomer to get tooling in a previously tiny corner (Windows) of an uncommon language (OCaml). I’ll spend some time talking about the technical challenges, how I’ve overcome them, and what still needs to be done. I’ll also talk about t...
Gabriella Gonzalez, "How to Write a Nix Derivation"
Переглядів 3 тис.Рік тому
This talk will explain how to use Nix like a `make` replacement. Even though Nix isn’t typically used in this way it’s actually well-suited for this purpose and this talk will walk through how to translate `make` idioms to Nix idioms and explain some of the tradeoffs of doing so.
Paul Biggar, "Darklang: A Functional Language for the Cloud"
Переглядів 362Рік тому
I’ll introduce and demo darklang, a “deployless” programming language for building cloud backends, talking about why I built it and what it’s good for. I’ll focus a little bit on why we chose a functional language, and how functional paradigms (esp immutability) allow us build features that don’t exist elsewhere. Bio: Paul Biggar is the founder of Darklang, and previously was Founder and CEO of...
Eric Normand, "Domain Modeling: How Rich Meaning Improves Your Code"
Переглядів 547Рік тому
The field of software design aims to make our software easier to maintain and change. But it has failed. After years of design advice, we still face unreadable code, expensive changes, and growing refactoring backlogs. Domain modeling is a deeper approach. Instead of focusing on the superficial quality of code as software design does, domain modeling focuses on encoding deep meaning. If you enc...
John Cavnar-Johnson, "The 'a List"
Переглядів 1262 роки тому
“One more thing, we need the new system to produce our invoices/estimates/contracts/whatever as PDFs.” Producing Portable Document Format files is one of the gnarliest problems I have to deal with on a regular basis. Tonight I’m introducing a new OSS project to make it a little simpler for F# developers to render PDFs from line of business application. Inspired by FsExcel (which in turn was ins...
Rashad Gover, "Hypermedia-Driven Web Apps in Haskell"
Переглядів 7852 роки тому
Abstract: In this talk I present a new approach to building web apps in Haskell, using htmx. htmx gives you access to AJAX, CSS Transitions, WebSockets and Server Sent Events directly in HTML, using attributes, so you can build modern user interfaces with the simplicity and power of hypertext. With the power of this technology, Haskellers can now build 100% Haskell web apps without depending on...
Richard Feldman, "Pushing Boundaries with Roc"
Переглядів 11 тис.2 роки тому
Richard Feldman, "Pushing Boundaries with Roc"
Steven Proctor, "The Interceptor Pattern"
Переглядів 6302 роки тому
Steven Proctor, "The Interceptor Pattern"
Rafal Dittwald, “Data Oriented Programming”
Переглядів 7 тис.2 роки тому
Rafal Dittwald, “Data Oriented Programming”
Rúnar Bjarnason, "Unison: A Friendly Programming Language from the Future"
Переглядів 6 тис.2 роки тому
Rúnar Bjarnason, "Unison: A Friendly Programming Language from the Future"
Christopher Bremer, "Types and Categories the 'Easy' Way"
Переглядів 6292 роки тому
Christopher Bremer, "Types and Categories the 'Easy' Way"
Joey Hess, "Programming Arduinos with Haskell and NASA's Copilot"
Переглядів 2,1 тис.2 роки тому
Joey Hess, "Programming Arduinos with Haskell and NASA's Copilot"
Jeffrey Olson, "Functional Programming in Rust"
Переглядів 18 тис.2 роки тому
Jeffrey Olson, "Functional Programming in Rust"
Karl Lehenbauer, "TCL: The Tool Command Language - LISP for the Masses"
Переглядів 6 тис.3 роки тому
Karl Lehenbauer, "TCL: The Tool Command Language - LISP for the Masses"
David Allsopp, "OPAM: The OCaml Package Manager"
Переглядів 4133 роки тому
David Allsopp, "OPAM: The OCaml Package Manager"
Jade Allen, "My Favorite Papers: Out of the Tar Pit"
Переглядів 9143 роки тому
Jade Allen, "My Favorite Papers: Out of the Tar Pit"
Richard Feldman, "Millions of Users, Purely Functional Code"
Переглядів 8 тис.3 роки тому
Richard Feldman, "Millions of Users, Purely Functional Code"
Gabriel Gonzalez, "Dhall: A Programmable Configuration Language"
Переглядів 6463 роки тому
Gabriel Gonzalez, "Dhall: A Programmable Configuration Language"
How often do names change? Really? A straw man leading away from the many upsides of Merkel trees for “versioning”. In actuality, I would even include the name of definitions into that Merkel tree itself.
Love to see that Roc is getting more pragmatic!
4:42 Not a big issue but I hope some day compiler will be smart enough to understand that non-empty compile-time list is never empty :)
I've literally just saw Jose Valim on ThePrimeagen show telling that he tries and tried to bring imperative while loop in functional language.
This is super clever!
great people are presenting in your group
I've been following Roc for a while now (I did the advent of code in it last year!), and I was just wondering, what was the reasoning for only using a naming convention of ending impure functions with "!" instead of requiring "!" as an operator when calling impure functions? It seems to me that it would be simpler to have it be based on the type of the function being called, similar to how "?" or "try" are often used for calling fallible functions (e.g. Zig, Rust). Was it mainly so that changing a function from pure to impure just causes warnings rather than type errors? Also, I'm a big fan of the approach of keeping a simple distinction between pure and impure functions. For a while, I was working on a compiler that supported annotating arbitrary effects (including effect-polymorphic types and functions) as a personal project, and it led to a lot of complexity that probably isn't worth it in my opinion (especially regarding type inference and compiler errors). I'm excited to see where Roc goes!
Roc is looking spectacular! 🎉 I wish Richard and friends would hurry up and get it out the door. LOL.
This stuff is priority number one right now! And of course, contributions are always welcome 😉
At 26:00, if you put another function within the printAsteriks! function that mutated totalPrinted_, wouldn't that one be unpure?
I think mutation isn't the way to think of var, it's more accurate to think "reassignment". A called function couldn't "mutate" totalPrinted_, it could only use the current value immutably to generate a different value and reassign it to totalPrinted_
@@smores56 right, but would a nested function inside printAsteriks! be allowed to reassign totalPrinted? would that apply only within the nested function? if so that it would be pure actually and that kinda makes sense
@@deryilz we haven't ironed out the details yet, and I'll probably spark up a discussion on this. It seems like we should probably not allow closures to capture var variables because you don't know which value you'll get.
@@smores56 cool. I know koka is an effect based language, and it doesn't let you do it to avoid complications
Great talk as always! I really loved the -> and => features, and using the bang (!) to unwrap the result is awesome. I’m not too sure about the var x_ = 1; x_ = x_ + 1 syntax, though. I think something more explicit would work better for mutability. Like var x = 1; x <- x + 1
LOL I was prepared to be surprised, turns out its just effectful types. Also, Julia-like in place mutation convention.
awesome :D
Cool vid! Just to say the feature attributed to Gleam's at around 50mins doesn't exist in Gleam. Gleam doesn't have anything like that as we prefer to always keep it explicit.
I think there's quite a fundamental misunderstand of what Gleam's `use` is. It is true that folks new to Gleam often take a little time to get their head around the feature, but it has nothing to do with IO, monads, `do` notation, ocaml's binding operators...
Gleam's `use` is exactly like the first example - the arrow backpassing.
oh, no - really sorry about that! I'd heard about the feature and thought that was how it worked, but I didn't actually verify that in the docs...definitely my mistake. 🙇
Super talk, plus great Q&A dialogue at the end.
Man, so fun audiences :)
Great video!
Sounds like the mic is about 15 feet away from the speaker.
Lots of great ideas here. However I think this makes dependency management really difficult. For example, if you have a large function which is found to have an important bug in some old version, it seems like it would be really hard to identify the users of that code and patch the bug just for the affected cases.
I don't like type-inference. "Explicit is better than implicit". Reading other people's code in languages with type-inference can sometimes be very confusing. I see type annotations as more documentation for the reader/maintainer. If a feature makes it easier to read other people's code and harder to write your own code, then reading trumps writing and it's a good feature. and If the converse is true, it's a bad feature. "Typing [as in pressing keys on the keyboard, not type-systems] is not the bottleneck".
nice work...
Hey, great talk! I am wondering how you get the hx attributes for lucid?
Efsanesin hocam
great insights
no mutable variables == no mass adoption
THANK YOU
For those interested, I recommend Koka. Really incredible language.
If it had array programming where the old arrays were dropped after writes, I would use it
Comedy!
Would we still need Elm if we have Roc with a corresponding Web UI library?
The questions intermission ends at 49:32
I came up with this idea of storing programs in structural format aroun 2013 - originally thought its future just like you think. I later however found value in the text representation - just more structured languages, but still text. I think now that is future not this. Also learned that big-idea languages usually are not the future - they are useful experiments as full-size prototypes more often than solutions. -- But its really interesting to see something similar to what I imagined back in uni (and also talked to people about) come to exists ;-) Its also so interesting to see its "same core idea made differently" - also the distributed part is interesting and all where you went with this idea is actually pretty awsome..
As long as there is a text editing interface the code at some level its still just a 'more structured language'. The bad stuff happens when you try to prevent users from being able to express invalid code by requiring that they only express code as a self-validating data structure. You need to be able to put square pegs in round holes when programming. If for no other reason than to demonstrate why you otherwise shouldn't.
“The compiler can always infer the type.” Whoa. That’s pretty cool.
P r o m o S M 👇
I believe the statement at 26:30 is incorrect about Rust. Calling `let fut = get_movies();` does not immediately fire an HTTP request. One must do `fut.await` afterwards (or just do `get_movies().await`.
Promo-SM
fantastic and easy to grasp. thank you so much!
Talk starts at 12:57
This static typing aspect was nicely addressed in Rich Hickey's "Maybe Not" talk which as well covered some conceptual issues in the Clojure's own spec library. That said, this is not about statically typed systems nor about specs - this is all about picking up concepts more accurately whatever the system one is building. For instance, if you heavily lean onto things like Optional/Maybe/Either because of lacking proper Union types in your language's type system, you are screwed.
I am humbled and elated to see such great language design!!! Looking forward to see isomorphic Roc code, so we may use it for both web server and the browser. What about type classes and generics?
Does NoRedInk intend to use it in any capacity
I have trouble watching a presentation by a guy who is not smart or less self-centered enough to lower the resolution of his screen so that his presentation can be readable on UA-cam. What I do, I just move on! Not worth it.
It’s very readable? Are you watching on a phone? This was live streamed so I doubt he considered that case
@@sayakchatterjee4454! I was not watching it from a phone. I started watching it from a laptop. He is not alone to do that. It looks like many of these guys are more concerned about showcasing their large monitors than making their videos readable. Often these UA-camrs shoot these videos just to showcase their "skills" and working environment to potential employers. This issue almost never happen to those who are trained in creating tutorials. That's why I prefer getting my tutorials from places like PluralSight, Coursera, Udacity, EggHead, etc, where these kinds of details (display resolution) are taking care of.
@@sayakchatterjee4454! Beside that, I tend not to watch tutorials where the authors put their face in the video. Not-only it distract viewers from focusing on the content, it is egotistic/narcissistic.
I utterly love this. Btw, one thing to consider re runtime: WASM & WASI.
I’m i 0:28 0:28
I already know I'll use the catchall errors return "ahhhhhhhhhhhhhhhh"
Love it, but those numbers need to be fixed, ints and reals should be distinct. Go full numeric tower.
This was awesome! Thanks to the Clojure gratitude slack channel and Thomas Moerman for posting.
i remember using livescript all the way back before node even had async await, and you had to callback hell everything. livescript backcalls thing was so good
So as i understand roc somehow stores type information ay least in test env to run program without undefined behaviour?
he says at 54:09 that a line with a type error is replaced with just an abort, which shouldn't require them to keep type information around at runtime
In PHP i can have types, IDE will complain, but I can still run the program )
Sure, you can also have IDE perfectly happy and still get runtime type errors. That's what I want to avoid.
Makes you think how necessary is to use zod, io-ts, or other parsing libraries in the js ecosystem