"Functional Software Architecture" refers to methods of constructionand structure of large and long-lived software projects that areimplemented in functional languages and released to real users,typically in industry.
The goals for the workshop are:
To assemble a community interested in software architecturetechniques and technologies specific to functional programming;
To identify, categorize, and document topics relevant tothe field of functional software architecture;
To connect the functional programming community to the softwarearchitecture community to cross-pollinate between the two.
FUNARCH 2024 will be co-colocated with ICFP 2024in Milan on September 6th 2024.
News is available on Mastodon,Bluesky, andTwitter.
FUNARCH adheres to the SIGPLAN/ICFP Code of Conduct.
Functional programming in the small works great. Things start to getshaky when there are many services and teams involved, something thatis becoming more and more common with large distributed systems.
The value of the tools we know and love, like static typing andpowerful type systems, decreases as the system gets larger and thenumber of components involved increases. In an industry that oftenpraises fast paced releases (the ultimate startup motto: ship fast ordie trying), this becomes even more problematic.
How do we get to enforce correctness and reap the benefits of FP, whenwe can't statically check the entire system? When we have to cross theboundaries of a single compilation unit? Our beautifully crafted typesaren't going to cut it.
This is where Software Architecture comes in. A well architectedsystem is not some stroke of genius: often the opposite. Good softwarearchitecture means you still get to reason about the whole thing andmake changes to separate components without affecting others. While wecan afford some complexity in the small (ie. fancy types), complexityin the large can break a project. As much as we wish we could solvethese issues with static typing or formal verification, part of thesolution is definitely non-technical. Conversations among all partiesinvolved (yes, business people included) are key for good architectureto emerge.
We'll talk about what I found to be the more effective techniques toarchitecture such large systems: event sourcing, cqrs and the overarching philosophy of Domain Driven Design.
In the practices of machine learning, Feature Engineering is a crucialstep that converts raw data to the inputs of models. This processconventionally relies on data processing languages (typically SQL) andnow sees arising challenges from the advancement of machine learningtechniques. We present the design of F3, a DSL and a compilerdeveloped at Meta. We show how F3 transforms the inspirations fromfunctional programming and type theory to an industrial grade softwarearchitecture that empowers a platform that serves billions of users.
This paper describes the design of a verified tool for analyzing toolpaths defined in the RS-274 language for 3d printing systems. Wedescribe how the analyzer was designed to allow a mixture ofverification and code-extraction techniques to be combined forconstructing a correct toolpath analyzer written in the OCamllanguage. We show how we moved from a fully hand-written OCaml programto one incorporating verified components, highlighting architecturaldecisions that were made to facilitate this process. Finally, we sharea set of architectural lessons that are generally applicable to othersoftware with a similar goal of integration of verified components.
Cardano is a Proof-of-Stake cryptocurrency with a market cap in thetens of billions of USD and a daily volume of hundreds of millions ofUSD. In this paper we reflect on applying formal methods, functionalarchitecture and Haskell to building Cardano. We describe ourstrategy, our projects, reflect on lessons learned, the challenges weface and how we propose to meet them.
Surveys and experiments in economics involve stateful interactions:participants receive different messages based on earlieranswers,choices, and performance, or trade across many rounds withother participants. In the design of Congame, a platform for runningsuch economic studies, we decided to use delimited continuations tomanage the common flow of participants through a study. Here we reporton the positives of this approach, as well as some challenges of usingcontinuations, such as persisting data across requests, working withdynamic variables, avoiding memory leaks, and the difficulty ofdebugging continuations.
Data structures are the foundation of software. Different componentsof a system may need the same information but may have differentdemands on its structure for reasons of performance, resourceefficiency, technical constraints, convenience, and so on. Forinstance, transmitting data over a network requires a format that issuitable for serialization, while persisting data requires a formatthat is more suitable for storage. Thus, programmers need to translatedata between several data structures and formats all thetime. Authoring these translations manually is a lot of work becauseprogrammers need to implement the logic twice, once for eachdirection. This is redundant, tedious, and error-prone, and a case oflow coherence. We show how using bidirectional data transformationsthat use functional optics like lenses and projections simplify theconversions. These ideas and techniques make converting data simpleand straightforward and foster understanding of the relationshipbetween data structures by explicitly describing their connections ina composable manner.
Mike Sperber (Active Group, Germany)
Perdita Stevens(University of Edinburgh, UK)
Annette Bieniusa(University of Kaiserslautern)
Jeffrey Young (IOG)
Will Crichton(Brown University)
Isabella Stilkerich (Schaeffler Technologies AG)
Kiko Fernandez-Reyes (Ericsson)
Ryan Scott (Galois)
Satnam Singh (Groq)
Facundo Dominguez (Tweag)
Ilya Sergey (University of Singapore)
Martin Elsman (University of Copenhagen)
Benjamin Pierce(University of Pennsylvania)
Matthew Flatt(University of Utah)
Nada Amin(Harvard University)
Richard Eisenberg (Jane Street)