Unison言語を試してみる

本投稿は 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つです。

詳しくは、

などの記事を読むといいでしょう。

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"と表示されるのが分かったかと思います。

今回は軽いチュートリアルで終わってしまいましたが、以上になります。 興味を持ってくださった方は、参考文献をご覧ください。

参考文献

www.unison-lang.org

公式サイト。

www.unison-lang.org

なぜデータベースでコードを管理するのか?についての説明。

Unison Cloud

Unison Cloud の公式ページ。

www.unison.cloud

Unison Cloud でサーバーサイドアプリケーションを作るチュートリアル。 本記事のチュートリアルの部分は、この内容をそのまま利用しました。

Unison 言語から、「次」の言語を考察したい

mizchi氏による記事。Unisonの紹介と使い方の説明。

テコテックの採用活動について

テコテックでは新卒採用、中途採用共に積極的に募集をしています。
採用サイトにて会社の雰囲気や福利厚生、募集内容をご確認いただけます。
ご興味を持っていただけましたら是非ご覧ください。 tecotec.co.jp