◆ Elm より使いやすくなってそうなところも使いづらくなってそうなところもある
◆ HTML を扱うフロントエンドフレームワークというわけじゃなさそう

Elm の後継と言われてる言語です
先週か先々週くらいにはてなブックマークで人気に出ていて何か大きな更新があったのかなと思って後で見ようと思ってたのに忘れていて今になって見てみました
以前はドキュメントも整ってなくて 長い文章のページだけみたいな感じでしたが 公式サイトがきれいになってました
https://www.roc-lang.org/

まだドキュメントはあとで追記予定となってるところもありますが ウェブページ上で REPL が動いたり 以前よりも進化していました

ドキュメントが整ったら Elm とどう違うのか見てみようと思っていたので 簡単にチュートリアルを読んで気になったところを書いておきます

文字列結合

Elm と違うところも多く 文字列結合は ++ では行えません
関数を使うか string interpolation という方法で文字列中の変数埋め込みみたいなことをします

"foo" ++ "bar"

をやるには

"\("foo")\("bar")"

となります

関数

関数も違ってます
Elm は Haskell がベースなので Haskell と同じく

add x y = x + y

add 1 2
-- 3

という形で関数を宣言できました
別の方法としてラムダを使う方法もありました

add = \x y -> x + y

add 1 2
-- 3

Roc だとこのラムダの方だけしか使えません
また引数の間には , が必要です

add = \x, y -> x + y

add 1 2
# 3

カリー化されない

, が必要ということもあってデフォルトではカリー化されていません

add1 = add 1
add1 2
# 3

ということはできません
次のように引数が足りないエラーです
The add function expects 2 arguments, but it got only 1

そのため List.map の関数も 1 つめの引数が関数ではなく リストになっていました

List.map [1, 2, 3] \num -> num * 2

JavaScript でアロー関数を連続させるようなことをすればできなくはないですが 一気に呼び出す場合はカッコが気持ち悪くなります

add = \x -> \y -> x + y
(add 1) 2
# 3

add1 関数を作ろうと こうすると 現状だと add1 を作るところでエラーでした
(最新のビルドを使ってローカルで REPL を動かすと大丈夫でした)

add1 = add 1
add1 2
# 3

よくある代入風の =

他には Elm/Haskell では一時変数がほしいときに let-in を使う必要がありましたが Roc だと使わず自然な感じで = を使えるのが便利です
definition と呼ばれるもので変数の代入とは違い あとから変更できません

addMax10 = \x, y ->
max = 10
added = x + y
if added > max then
max
else
added

addMax10 3 4
# 7

addMax10 8 9
# 10

タグ

小文字の名前だと def で大文字の名前だと tag になります
タグは文字列みたいなもので それ自体が値です
また関数のように使い引数を渡すことでそれらの値を持つタグになります
この値は payload と呼ばれるようです
Rust の enum など関数型言語の型でよく見るものですね

ただ payload は自由につけれるようです

» Foo 1
Foo 1 : [Foo (Num *)]

» Foo 2 3
Foo 2 3 : [Foo (Num *) (Num *)]

» Foo 1 {x:2} [3]
Foo 1 { x: 2 } [3] : [Foo (Num *) { x : Num * } (List (Num *))]

Elm では

type FooOrBar
= Foo
| Bar

value1 = Foo

みたいに型定義を事前にする必要があり その定義時に指定したデータ型しか持たせられません
このあたりは自由度が上がっていますね

HTML との関係

あと一番の違いですが Elm は React などのようなフレームワークと言語が統合されたもので 出力の基本は HTML でした
それにたいして Roc は特に HTML を意識してるわけではないようです

普通の言語のようにビルドしてコマンドラインで実行する感じです
Rust で作られてるので WASM でのビルドもされていて ウェブページの REPL はこれで動いてるようでした

そういう立ち位置なので後継というのは言語の構文的な話であって Elm を置き換えるかというとそうでもないのかもしれません
Roc で動くウェブフロントエンドのフレームワークが出てきたらそういう使い方もできるのかもしれませんけど

個人的には Elm って Haskell みたいな言語構文が好きというよりは Redux の元にもなった Elm Architecture の考え方のほうが好きです
view はコンポーネントにせず完全にテンプレートを返す純粋関数になってるので React に比べてすごくすっきりしていますし
なので こういう普通の言語となると Elm というより比べる対象は Haskell になりそうで あまり使いそうにないかなと言う感想です