Futhark by Example
74 points
by tosh
5 hours ago
| 6 comments
| futhark-lang.org
| HN
ethanlipson
4 hours ago
[-]
Futhark is really such a great idea. I'm not convinced that dependent types are worth the cognitive overhead in general, but it's definitely worth it to include the length as part of the type information for dynamic arrays, e.g.:

  concat(Vec<T, n>, Vec<T, m>) -> Vec<T, n+m>
  matmul(Mat<T, n, m>, Mat<T, m, l>) -> Mat<T, n, l>
  head(Vec<T, n+1>) -> (T, Vec<T, n>)
This would have saved me so much headache debugging CUDA kernels and numpy!! I wish it were a first-class feature in those frameworks, and even general-purpose languages, but alas.
reply
itishappy
1 hour ago
[-]
Here they are in Futhark:

    val concat [n] [m] 't : (xs: [n]t) -> (ys: [m]t) -> *[n + m]t
    val matmul [n] [m] [l] 't : (xs: [n][m]t) -> (ys: [m][l]t) -> *[n][l]t
    val head [n] 't : (x: [n]t) -> t
And here's the pathological case (length cannot be determined at compile time):

    val filter [n] 'a : (p: a -> bool) -> (as: [n]a) -> *[]a
Other pathological cases include conditionals and loops.
reply
VorpalWay
3 hours ago
[-]
You can do this with templates in C++ and generics in Rust I'm pretty sure. I think the Eigen C++ library supports this. (I have yet to do a linear algebra heavy Rust project, so I can't speak to the options that exist there.)
reply
ethanlipson
1 hour ago
[-]
I'm talking about cases where the array size is not known at compile time. For example, say the user passes in a list of numbers as command line arguments. Then we have

  argv: Vec<String, argc>
If I want to map these to ints, then I'd like a compile-time guarantee that the resulting array

  nums: Vec<Int, argc>
is the same length as argv. Lean and Idris can do this, but AFAIK no commonly used languages can. But unlike general dependent types, these are not hard to wrap one's head around and would save a lot of frustration, in my experience.
reply
otabdeveloper4
3 hours ago
[-]
Yeah, C++ arrays are literally that.
reply
alpinisme
2 hours ago
[-]
Arrays are not dynamically sized though (handling runtime sizes) and don’t have efficient append/concat. The point of the dependent types is that you can have the type system track that concat creates an M+N length vector, sort preserves length (and adds a sorted guarantee that slice preserves), etc. Sure you can do a lot with templates, but that’s advanced templates not just “C++ arrays” in a throwaway “literally that” way.
reply
antran22
48 minutes ago
[-]
Was expecting to see some examples of how to read runes, but I am nonetheless equally satisfied.

https://en.wikipedia.org/wiki/Elder_Futhark

reply
CapricornNoble
2 minutes ago
[-]
Same. Thought I had a copy of Uthark [1][2] on my shelf too but alas I seem to have only retained Svartkonst [3] during the tragic downsizing of my library.

[1] https://archive.org/details/karlsson-thomas-uthark-nightside...

[2] https://www.84cxrarebooks.com/pages/books/090763/t-ketola-th...

[3] https://www.miskatonicbooks.com/product/thursakyngi-iv-svart...

reply
Ferret7446
4 hours ago
[-]
It would be nice to not name your language after another language. (Yes I know it's a script, that doesn't change my point). I came here expecting something else.
reply
hmry
1 hour ago
[-]
Yeah, when naming your language, it's important to keep mind the expectations of people seeing headlines about articles about your language on blog aggregation sites :^)

Now I'm thinking about "Smalltalk by Example" and "Slang by Example"

reply
echoangle
3 hours ago
[-]
reply
jgrowl
2 hours ago
[-]
Jackson Crawford's youtube channel is very helpful academic source.

For those that don't know, Futhark is comes from the first 6 letters of the runic alphabet (F, U, Þ, A, R, K)

https://www.youtube.com/@JacksonCrawford

reply
finaard
1 hour ago
[-]
Same here, I was very confused for a bit.
reply
fulafel
2 hours ago
[-]
Futhark is a glimmer of light in the wasteland of C/C++ styled low level GPU languages.
reply
rowanG077
4 hours ago
[-]
Futhark is pretty great! And I have to say that the maintainer is insanely quick. It has happened on more than one occasion that I reported a bug and it's solved within the day. I have been using Futhark in prod for two years now and never had serious problems.
reply
keyle
3 hours ago
[-]
Interesting, what do use it for if you can share?
reply
rowanG077
2 hours ago
[-]
Optimization algorithms. The build in automatic differentiation is great!.
reply
Reefersleep
3 hours ago
[-]
What is your use case?
reply
guessmyname
2 hours ago
[-]
Couldn’t have chosen a more difficult (and ambiguous) name to pronounce, could you? It almost sounds like a curse that I often hear people say out in the bad streets of New York City.
reply
antran22
50 minutes ago
[-]
Elder [0] and Younger [1] Futhark (or Fuþark) are the name of two runic writing systems used by Germanic and Scandinavian Vikings. The name Futhark is a combination of the first 6 runes /f/, /u/, /ð/, /ɑ/, /r/, and /k/. Similar to how you get the name "alphabet" from the first two letters of Greek's writing system.

[0]: https://en.wikipedia.org/wiki/Elder_Futhark

[1]: https://en.wikipedia.org/wiki/Younger_Futhark

reply