本投稿は TECOTEC Advent Calendar 2025 の20日目の記事です。
DX本部システム開発第一事業部 の川﨑です。新卒1年目で、普段は、TypeScriptでフロントエンドやバックエンドの開発を行っています。
今日はUnisonという言語について調べてみます。
注意:筆者は自分でUnisonのプログラムを書いた経験があるわけでなく、以下の説明は、公式ドキュメントなどで調べたことをまとめたものであることを念頭に置いてお読みください。もし改善点や指摘などあれば、はてなブックマークのコメントなどで教えてください。
今回は特徴の説明と軽いチュートリアルを行います。
Unisonの特徴
Unisonは静的型付きの関数型プログラミング言語で、構文としては関数型言語のHaskellに似ています。 目立った特徴が2つあります。
特徴1. ソースコードをファイルで管理しない
Unisonは、ファイルで管理するのではなく、コードベースと呼ばれる専用のデータベースでコードが管理されている一風変わった言語です。 コードベースでは、1つ1つの関数は、関数に対応する一意的なハッシュで管理されています。
こうすることで、複数のコンピュータで分散してネットワーク越しに1つの計算を実行する分散プログラミングが容易になるそうです。
ハッシュと関数の対応関係は、一度関数を定義してしまえば変わりません。 コードを変更した際は、関数名→ハッシュの対応を変え、ハッシュ→関数の対応自体は変わらないそうです。 そのため、一度型チェックされた定義は二度と再チェックする必要がなく、再ビルドが不要になります。
Unison Cloudという公式のクラウドがあり、Unisonの言語自体と同じ型システムがついている専用のストレージなどの機能が利用できるようです。このストレージを使うと、JSONなどにシリアライズする必要なく、Unisonの値をそのままストレージに格納できます。 今回はUnison Cloudを実際に試してみます。
特徴2. Algebraic Effectsがサポートされている
Algebraic Effectsというのは、プログラムにおける副作用 (入出力や、例外処理、状態変化など)を扱う際の仕組みの1つです。
詳しくは、
- [翻訳] Why Algebraic Effects? - なぜ代数的エフェクトなのか
- Algebraic Effectsとは? 出身は? 使い方は? その特徴とは? 調べてみました! - lilyum ensemble
などの記事を読むといいでしょう。
Algebraic Effects における Effect は、UnisonではAbilityという名前で呼ばれています。
インストール
インストールしてみます。
https://github.com/unisonweb/unison/releases を見て、自分のPCに合ったものをダウンロードしましょう。
私はLinuxでインストールします。
ucm-linux-x64.tar.gzをダウンロードし、
mkdir unison tar -zxf ucm-linux-x64.tar.gz -C unison
で解凍すると./ucmというファイルが作成したunison/ ディレクトリ内に生成されます。
早速./ucmというコマンドを実行してみましょう。
すると、以下のように出ます。
$ cd unison $ ./ucm _____ _ | | |___|_|___ ___ ___ | | | | |_ -| . | | |_____|_|_|_|___|___|_|_| 👋 Welcome to Unison! You are running version: release/1.0.0 warm-hearted-urchin/main>
Unison Cloud
公式のクラウドであるUnison Cloudを利用してみましょう。https://www.unison.cloud/ から、GitHubアカウントを連携して登録します。 無料版では、限定的に機能を利用できます。
そのあと、クラウド側とローカルのUCMとを連携するために、ucmコマンドを打ち、次のように入力して、ブラウザから連携します。
scratch/main> auth.login
以下のコマンドでプロジェクトを作ります。
scratch/main> project.create-empty cloud-start
以下のコマンドを実行すると、Unison Cloudのサンプルプログラムなどを含むパッケージがもってこれるようです (下のチュートリアルを実行するために必要):
cloud-start/main> pull @unison/cloud-start/releases/latest
チュートリアル
scratch.uというファイルを、ucmを実行しているのと同じディレクトリに配置し、以下のコードをコピペしてみましょう (公式ドキュメントにあるコード)。
helloWorld.logic : HttpRequest ->{Exception, Log} HttpResponse
helloWorld.logic = Route.run do
use Text ++
name = route GET Parser.text
info "request for greeting" [("name", name)]
ok.text ("👋 hello " ++ name ++ "\n")
exercises.ex1_quickstart.deploy : '{IO, Exception} URI
exercises.ex1_quickstart.deploy = Cloud.main do
serviceHash = deployHttp exercises.env() helloWorld.logic
serviceName = ServiceName.named "hello-world"
ServiceName.assign serviceName serviceHash
GETリクエストのクエリを取って、"hello {クエリ文字列}" という出力をHTTPレスポンスとして返すプログラムです。 Unisonではプログラムを恒常的にファイルに保存するわけではないですが、コードベースに反映する前に一時的にscratch.uというファイルにプログラムを書いています。
updateというコマンドを入力するとファイルの内容が、Unisonのコードベースに反映されます。
cloud-start/main> update Done.
以下のコマンドで、上のプログラムをクラウド上にデプロイできます。
cloud-start/main> run exercises.ex1_quickstart.deploy
Service exposed successfully at:
https://[GitHubアカウント].unison-services.cloud/h/ppejqui3pue7fyx6do5d2x4xxvngtxt7reid4jjtamm6x4i6sbmq/
Service with hash: ppejqui3pue7fyx6do5d2x4xxvngtxt7reid4jjtamm6x4i6sbmq now available at:
https://[GitHubアカウント名].unison-services.cloud/s/hello-world/
URI
(Scheme "https")
(Some (Authority Optional.None (HostName "[GitHubアカウント].unison-services.cloud") Optional.None))
(Path ["s", "hello-world"])
(RawQuery "")
(Fragment "")
表示されるhttps://[GitHubアカウント名].unison-services.cloud/s/hello-world/kawasaki でアクセスすると、"👋 hello kawasaki"と表示されるのが分かったかと思います。
今回は軽いチュートリアルで終わってしまいましたが、以上になります。 興味を持ってくださった方は、参考文献をご覧ください。
参考文献
公式サイト。
なぜデータベースでコードを管理するのか?についての説明。
Unison Cloud の公式ページ。
Unison Cloud でサーバーサイドアプリケーションを作るチュートリアル。 本記事のチュートリアルの部分は、この内容をそのまま利用しました。
mizchi氏による記事。Unisonの紹介と使い方の説明。
テコテックの採用活動について
テコテックでは新卒採用、中途採用共に積極的に募集をしています。
採用サイトにて会社の雰囲気や福利厚生、募集内容をご確認いただけます。
ご興味を持っていただけましたら是非ご覧ください。
tecotec.co.jp