コンテンツにスキップ

Unison

出典: フリー教科書『ウィキブックス(Wikibooks)』

Unison(ユニソン)は、Haskell系の強い静的型付け関数型言語であり、コードを関数ごとに内容アドレス(ハッシュ)で識別し、型安全かつ分散環境に強いプログラミングを可能にすることを目的とした、革新的な言語です。

Unison とは?

[編集]

Unisonは通常のソースコードファイルの代わりに、コードの内容(構文木)をハッシュで管理するユニークな構造を持っています。これにより、関数やデータ型が名前ではなくハッシュで識別され、変更管理や依存関係の解決、コードの分散共有が容易になります。

  • 構文はHaskellに似た関数型スタイル
  • 型推論が強力で、型安全
  • 分散・永続化を前提とした実行モデル
  • ucm(Unison Codebase Manager)でコード管理

Hello World

[編集]

UnisonではコードはREPLまたはucm(Unison Code Manager)を通して記述します。

helloWorld : '{IO} ()
helloWorld = printLine "Hello, Unison!"

このコードを定義した後、Unisonは自動的に内容ハッシュで保存します。helloWorldの中身を変更すると、元の関数とは別の関数として扱われます(名前が同じでもOK)。

関数の定義と型推論

[編集]
add x y = x + y

これはUnisonにとって有効な定義です。Unisonは自動的に型を推論し、次のような型を付与します:

add : Nat -> Nat -> Nat

明示的に型を書いても構いません:

add : Int -> Int -> Int
add x y = x + y

データ型の定義

[編集]

Unisonでは代数的データ型もサポートしています。

type Optional a = None || Some a
パターンマッチもできます:
describe : Optional Text -> Text
describe opt =
  match opt with
    None -> "Nothing here"
    Some t -> "Got: " ++ t

コードベースの操作(ucm)

[編集]

Unisonはファイルベースではなく、コードベースという内容ハッシュに基づくデータベースでコードを管理します。以下はucmでの操作例です:

> ucm
.> add
.> view myFunction
.> edit myFunction
.> update myFunction

更新は update によって明示的に行います。古いバージョンは自動的に保持されます。

リモートコードの取り込み

[編集]

Unisonでは他の開発者のコードを安全に再利用できます:

.> pull https://unison-lang.org/codebase/someuser/project

ハッシュベースで管理されているため、内容の信頼性が高く、依存の衝突も起きにくいです。

分散型システムへの応用

[編集]

Unisonの目玉のひとつが、関数の「場所」に関する記述を言語レベルで扱える点です。以下のように関数をリモートに「場所付き」で記述できます:

remoteFunc : '{Remote NodeA, IO} ()

これにより、コードの一部を安全にリモートノードで実行することが可能になります。

Unison の革新性

[編集]
  • 変更追跡が自動化されており、diff, update, historyが強力
  • ビルド不要:コードはASTで保存されるため、インクリメンタルに即時利用可能
  • 内容アドレス化:完全なイミュータブルコードベースが作れる
  • 将来的な分散ファーストの言語基盤

まとめ

[編集]
機能 内容
言語型 強い静的型付け関数型言語
実行環境 ucm 経由で対話式に使用
主要特長 内容ハッシュ管理、名前とは独立したコード識別
ストレージモデル 永続化されたコードベース(内容アドレス付き)
分散実行 言語レベルでリモートノード記述が可能

より深く試すには、公式の Unison TourPlayground を利用するのがおすすめです。