[HN Gopher] Fable is a compiler that brings F# into the JavaScri...
       ___________________________________________________________________
        
       Fable is a compiler that brings F# into the JavaScript ecosystem
        
       Author : philonoist
       Score  : 78 points
       Date   : 2021-10-17 08:38 UTC (2 days ago)
        
 (HTM) web link (fable.io)
 (TXT) w3m dump (fable.io)
        
       | Taikonerd wrote:
       | Is it my imagination, or has there been an upswing of interest in
       | F# on HN recently?
        
         | Zababa wrote:
         | Maybe a combination of churn from Scala, growing popularity of
         | .NET in general with .NET Core, lack of high-level stuff in Go,
         | static typing coming to dynamic languages (especially JS),
         | functional features getting everywhere. Lots of stuff is
         | pointing at it in a way.
        
         | drekipus wrote:
         | Tooling and marketing budget improvements I'd imagine
        
           | sbelskie wrote:
           | Tooling for sure. I would be shocked in the marketing budget
           | increased just based on how many recent .NET changes recently
           | exclude F# (e.g. source generators).
        
         | pininja wrote:
         | There was a wave of popularity in 2017 as well. I used to work
         | on it full time back then, and enjoyed it a lot. The
         | SQLProvider [0] and other type providers like it are super
         | impressive!
         | 
         | [0] https://fsprojects.github.io/SQLProvider/
        
         | zamalek wrote:
         | I have yet to learn it myself, but I get the idea that there is
         | a huge amount of people who "shut up and get shit done" with
         | it. Posts on HN tend to bring these people to the surface.
         | 
         | The interest has always been consistent, it's just not vocal.
        
         | 2mol wrote:
         | Yeah, I blame it on version 5 (and dotnet) and the overall
         | tooling improvements. It has really become an excellent and
         | easy to pick up language, with not too many warts and a very
         | good ecosystem.
        
           | zz865 wrote:
           | I hate myself, 5 years ago I gave up dotnet to move to Java
           | because it was more popular now I'm drowning in Spring beans
           | and wish I never switched.
        
             | svachalek wrote:
             | Ha, I'd be very interested in seeing a sociology study on
             | Java. There's nothing about the language itself says you
             | need to seize on half a dozen design patterns and beat them
             | into the ground, but that's what every Java project I've
             | ever seen looks like.
        
           | mdm12 wrote:
           | And version 6 is about to drop!
           | https://devblogs.microsoft.com/dotnet/whats-new-in-fsharp-6/
        
         | agumonkey wrote:
         | it's always been bubbling over here
        
         | UglyToad wrote:
         | Partly the question which caused me to brush off my trends site
         | [0] and add support for'#' and '+' tokens in the search.
         | 
         | Looks like somewhat of an increase but a very spiky baseline.
         | 
         | https://hn-trends.eliot-jones.com/Home/Trend?id=f%23&allword...
        
       | sbelskie wrote:
       | I've only played around with it on a few smaller projects, but it
       | blew me away with the simplicity and expressiveness. I've used it
       | a few times to make simple web based UIs for personal tooling and
       | am looking forward to using it on something bigger.
       | 
       | Just one of the many reasons I find myself more and more excited
       | by F#.
        
         | agumonkey wrote:
         | maybe rust contender on the frontend
        
       | satvikpendem wrote:
       | Is it named Fable due to its relation to the Fable series which
       | Microsoft publishes?
        
       | kirse wrote:
       | Along with Fable highly recommend a look at Feliz. A joy to work
       | with and its ViewEngine can also separately be used w/ Giraffe
       | just for the syntax:
       | 
       | https://zaid-ajaj.github.io/Feliz/
       | 
       | https://github.com/Zaid-Ajaj/Feliz
        
         | sbelskie wrote:
         | For those interested in Svetle, Sutil is another thing to check
         | out. Top of my head I can't remember if it is based on or just
         | inspired by Feliz.
         | 
         | https://github.com/davedawkins/Sutil
        
         | lf-non wrote:
         | Zaid Ajaj probably has had the biggest impact in establishing
         | the Fable/F# ecosystem.
         | 
         | Besides his numerous repos, the Elmish book [1] is really
         | awesome.
         | 
         | [1] https://zaid-ajaj.github.io/the-elmish-book/#/
        
         | eatonphil wrote:
         | > optimized for happiness
         | 
         | I like React and I like F#. But I never understand this kind of
         | marketing. It's not that I want things optimized for pain. But
         | I guess I'm just most interested in the technical choices and
         | actual performance in the domain over my own happiness?
        
       | spankalee wrote:
       | I don't know a ton about Fable, but they recently wrapped
       | Google's Lit to allow building functional templating and web
       | components in it: https://fable.io/Fable.Lit/
       | 
       | Seems like a neat project.
        
       | phillipcarter wrote:
       | Fable is a brilliant project.
       | 
       | It doesn't try to hide the fact that when you write a Fable
       | program, you're fundamentally in the JS ecosystem. This can be a
       | bit of a shift if you're used to doing stuff in .NET, but it
       | means that everything will more or less work with your code.
       | 
       | It also comes with a few tools/utilities to ease the F#-JS bridge
       | you're on.
        
         | amelius wrote:
         | > it means that everything will more or less work with your
         | code
         | 
         | So you can call any .NET library?
        
       | icey wrote:
       | Since we're in here talking about all kinds of F# goodies, has
       | anyone spent time with https://wiz.run/?
        
       | brundolf wrote:
       | Maybe I'm biased, but I'm often skeptical of the benefits of
       | projects like this that translate a language which normally
       | targets runtime A, into another language that targets a wildly
       | different runtime B (usually JS or WASM)
       | 
       | (Disclaimer that I'm not talking about compiling runtime-less
       | languages for different platforms)
       | 
       | It just seems like it's going to be a very leaky abstraction,
       | like there will be tons of corner cases where some behavior isn't
       | exactly the same and other behavior isn't quite possible, which
       | will cause libraries and in-house code alike to break in weird
       | ways. I know that ClojureScript, for example, has several caveats
       | relative to Clojure; and most of these translators are not nearly
       | as mainstream (and so don't get nearly as much maintenance
       | attention) as ClojureScript does. And then there's the messy
       | question of interacting with the host system, dropping down into
       | the host language for certain things, etc.
       | 
       | I haven't really worked with these kinds of systems so I may be
       | way off, but from the outside it seems like a huge increase in
       | complexity just so you get to stay in a familiar language
        
         | JaggerJo wrote:
         | I've written quite a lot of F# code for the web over the last
         | few years. Most of the time things just work as long as you
         | don't use overly specific .NET BCL stuff.
         | 
         | We had issues with Dates. Implementing a custom 'ZonedDateTime'
         | type with native implementations for both target platforms (JS
         | and .NET) was straight forward.
         | 
         | Other than that there are a few gotchas when doing 'advanced'
         | stuff:
         | 
         | - Fable does not support 'Array2D', 'Array3D', ... - Fable
         | allows the use of ints but you have to know that at runtime
         | they all are floats. - Fable does not support FSharp
         | Quotations. - Fable does not support the full reflection API.
         | 
         | More here: https://fable.io/docs/dotnet/compatibility.html
         | 
         | Would definitely recommend F# for both backend and frontend.
         | It's been a joy.
        
         | dwohnitmok wrote:
         | ClojureScript is in a weird boat because of a constant
         | background tension in goals of the Clojure community, where on
         | the one hand Clojure proclaims that it is a "hosted language"
         | and as such there shouldn't be an expectation of consistent
         | semantics across different hosts, but on the other hand devs
         | _really like_ consistent semantics if the language doesn 't
         | change. So the Clojure community has kind of settled on cljc
         | files as an indication of "works on all hosts in the way you
         | would expect" even though that's not any part of the guarantee
         | that a cljc file provides in any documentation anywhere (it
         | gives you reader conditionals and that's it). Basically
         | ClojureScript isn't really sure whether those "caveats" are
         | bugs or features and neither is the Clojure community at large.
         | 
         | More broadly they aren't sure whether causing "libraries and
         | in-house code alike to break in weird ways" on different hosts
         | is a bad thing (some folks would probably take issue with the
         | word "break").
         | 
         | On the whole however these projects can go very well. I've seen
         | e.g. ScalaJS and Scala backend projects work very well. They're
         | a lot less leaky than you would think. The vast majority of
         | code just works. In particular, there are clean lines between
         | what is supported by the abstraction and what isn't, and the
         | latter doesn't affect the former, so in that sense the
         | abstraction is pretty tight and not leaky. And the major win
         | isn't so much the familiar language part as it is the ability
         | to share code and definitions. It's really powerful to change a
         | line somewhere deep in your backend and have all the places you
         | need to make a change all the way out to the frontend UI
         | automatically laid out for you.
         | 
         | That said the big misconception, and where the abstraction is
         | incomplete if not leaky, is that these languages allow you to
         | disregard the runtimes of secondary targets. No compile-to-JS
         | language I know of has successfully done away with the need to
         | understand the HTML/CSS/Javascript stack. And that indeed is
         | extra complexity that should give pause to developers.
         | 
         | But RE "cause libraries and in-house code alike to break in
         | weird ways" generally does not seem to be the case for these
         | compile-to-JS languages.
        
         | kevinmgranger wrote:
         | I'm only passingly familiar myself, so I might be off here--
         | but F# already has that sort of feel and experience, where it
         | has some of its own ways of doing things despite integrating
         | into the .NET runtime.
         | 
         | In other words, the language designers and users are already
         | used to understanding corner cases and integrations into
         | ecosystems that are different.
        
           | brundolf wrote:
           | Interesting point! I haven't used F# so I assumed it was
           | pretty "native" to the .NET runtime
           | 
           | Still- I have to wonder about things like concurrency, which
           | is perhaps the most obvious limitation of targeting the JS
           | runtime
        
             | kevinmgranger wrote:
             | There are some caveats they outline for the usual async
             | stuff[1], but at a cursory glance, it's not that bad.
             | Thanks to F#'s computation expressions, .NET async code and
             | Fable.Promise code look almost identical.[2]
             | 
             | 1: https://fable.io/docs/dotnet/compatibility.html#Caveats-
             | II
             | 
             | 2: https://stackoverflow.com/a/54451205/4099287
        
             | phillipcarter wrote:
             | F# is certainly a .NET language depending on the lens with
             | which you view it. The object system and lots of its
             | semantics are the way they are because that's how .NET
             | works. However, a surprisingly large amount of this stuff
             | is translatable and makes sense with a JS runtime instead.
             | The fable authors have managed to thread the needle just
             | right so that it more or less "feels right".
        
         | kervantas wrote:
         | People would rather write a compiler than write js. Ridiculous.
        
           | Smaug123 wrote:
           | Er, yes? Compilers are _brilliant_ fun.
        
       | akdor1154 wrote:
       | What's even more exciting is there is work underway to allow
       | Fable to target Python instead: https://github.com/fable-
       | compiler/Fable/issues/2339
       | 
       | These things are bizarre when you think about the tech stack they
       | lead to, but undeniably still really useful in our unfortunate
       | real world. I think of F# as 'the pragmatist's functional
       | programming language', and projects like this follow that
       | mindset.
        
       ___________________________________________________________________
       (page generated 2021-10-19 23:00 UTC)