Unison Language and Platform Roadmap
unison-lang.org
unison-lang.org
A look at Unison: a revolutionary programming language - https://news.ycombinator.com/item?id=34307552 - Jan 2023 (84 comments)
The Unison language – a new approach to Distributed programming - https://news.ycombinator.com/item?id=33638045 - Nov 2022 (113 comments)
Unison Programming Language - https://news.ycombinator.com/item?id=27652677 - June 2021 (131 comments)
Unison: A Content-Addressable Programming Language - https://news.ycombinator.com/item?id=22156370 - Jan 2020 (12 comments)
The Unison language - https://news.ycombinator.com/item?id=22009912 - Jan 2020 (141 comments)
Unison – A statically-typed purely functional language - https://news.ycombinator.com/item?id=20807997 - Aug 2019 (25 comments)
Unison: a next-generation programming platform - https://news.ycombinator.com/item?id=9512955 - May 2015 (128 comments)
This video is a little old but I remember finding it really interesting and I think dives into it a bit.
h = hash(to_canonical_form(AST))
Preferably, there should be one-and-only-one way to perform or compute things, but modern PLs plagued by flexibility syndrome.
Also, the same should be done for the binaries, since the same AST may produce different binaries, unless you take into account all the compiler options, and runtime differences.
Determining if two programs are equivalent is generally as hard as running the programs for every input and comparing them.
Some practical solutions:
- reduce code variability, by removing similar/alternative programming constructs / flexibility syndrome
- stick to a single programming paradigm
- remove syntactic sugar, or provide a clear rules to reduce it to a sugarless canonical form
- use a rich standard library (to avoid reimplementing the same functionality in different ways)
- use rich standard data types (to avoid definition of the similar types in different ways)
- sort every unordered construct, similarly how AWS signature sorts the keys before calculating the API call signature
- reduce the use of macros, custom eDSLs, or highly personalized code (by making writing this kind of code inconvinient)
- etc.
In what sense?
I mean, in the following code
# version 0
name = "bob"
I branch and change to # version 1
name = "alice"
And you update the main branch to # version 2
name = "clair"
Then I'll still have a merge conflict right?How does a content addressed AST solve the problem of having a different intent?
https://www.unison-lang.org/learn/usage-topics/workflow-how-...
Personally I found Unison easy to pick up the basics for despite being unfamiliar with Haskell beforehand (although underlying ideas of how to structure things took a bit of time for me to figure out).
Maybe I’m not understanding, but it seems like there’s a single global instance somewhere.
There is no need for a central repository of any kind. Anyone can ship their own version of a library or program and there are no conflicts because they all have different content ids.
Unison language authors simply need to publish a hash of their latest release, and distribute the hash to users through any medium. Users can then retrieve the entire code base from its hash.
At least, this should be the goal, and content-addressability makes this feasible.
Great points, though!
[0] https://www.unison-lang.org/learn/the-big-idea/ [1] https://www.val.town/
But Unison is a lot more: it has a model that makes distributed computing feel like native code, and a content-addressed code representation system that solves a ton of tooling problems around versioning and deploying code. It's one of the most legitimately novel and powerful language projects I've ever seen, and I'm not saying that lightly.
Unison does not have monads, it has an effect system they call "abilities", which is quite innovative. Unison code is not stored in "textual" format, but directly in its AST form where everything has a content hash-address which is used to reference things everywhere. That's why they can take any function and send it for execution elsewhere in the cloud or whatever. It's also why there's no build system, and no dependency version conflict.
In summary, it's completely different than Haskell and most other languages, all you needed to do was visit the website and read a little bit to know that.
I did visit the website, observed an almost identical syntax to Haskell and left. Your comment is in bad faith.