Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions glossary.md
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,14 @@
| 基底ケース | Base case |
| スタックセーフ | Stack-safe |
| 継続渡しスタイル | Continuation-passing style (CPS) |
| イミュータブル | Immutable |
| ミュータブル | Mutable |
| 第一級 | First-class |
| 脱糖 | Desugaring |
| フルーエント API | Fluent API |
| 空でないリスト | Non-empty list |
| ラベル付き引数 | Labelled argument |
| エフェクト除外 | Effect exclusion |
| エフェクトメンバ | Effect member |
| 型メンバ | Type member |
| 限定継続 | Delimited continuation |
Expand Down
2 changes: 1 addition & 1 deletion src/advanced-features.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

この章では、Flix の高度な機能について解説します。内容は次のとおりです:

- [チェック付きキャスト](./checked-casts.md)と[チェックなしキャスト](./unchecked-casts.md)
- [検査付きキャスト](./checked-casts.md)と[未検査キャスト](./unchecked-casts.md)
- [`bug!` 関数と `unreachable!` 関数](./bug-and-unreachable.md)
- [純粋性リフレクション](./purity-reflection.md)
- [停止性検査](./termination-checking.md)
Expand Down
2 changes: 1 addition & 1 deletion src/arrays.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ Flix は、ミュータブル(可変)な _スコープ付き_ 配列(Array)を

Flix では、配列の型は `Array[t, r]` です。ここで `t` は要素の型、`r` はそのリージョン(region)です。Flix のすべての可変メモリと同様に、すべての配列はいずれかのリージョンに属さなければなりません。配列の読み取りと書き込みは _エフェクトを持つ_ 操作です。たとえば、型 `Array[t, r]` の配列から要素を読み取る操作はエフェクト `r` を持ちます。同様に、リージョン内で配列を作成する操作もエフェクトを持つ操作です。

配列は _常に_ アンボックス(unboxed)化されています。たとえば、型 `Array[Int32, r]` の配列は、プリミティブな32ビット整数の列として表現されます。すなわち JVM の用語で言えば、その配列は `int[]` として表現されます。Flix はプリミティブな整数を `java.lang.Integer` オブジェクトとしてボックス化することは決してありませんが、それでもジェネリックなコレクションや関数の中でプリミティブを使うことは許可しています。これは他の種類のプリミティブやプリミティブの配列についても同様です。
配列は _常に_ アンボックス化(unboxed)されています。たとえば、型 `Array[Int32, r]` の配列は、プリミティブな32ビット整数の列として表現されます。すなわち JVM の用語で言えば、その配列は `int[]` として表現されます。Flix はプリミティブな整数を `java.lang.Integer` オブジェクトとしてボックス化することは決してありませんが、それでもジェネリックなコレクションや関数の中でプリミティブを使うことは許可しています。これは他の種類のプリミティブやプリミティブの配列についても同様です。

配列は低レベルのデータ構造であり、通常はより高レベルなデータ構造を実装するために使われます。したがって、そのようなデータ構造を実装する場合を除いては、配列の使用は控えめにすることをおすすめします。代わりに、`MutList`、`MutDeque`、`MutSet`、`MutMap` といったデータ構造を使うことをおすすめします。

Expand Down
2 changes: 1 addition & 1 deletion src/associated-types.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

> 💡 **お知らせ**: このドキュメントはAIによって翻訳されています。表現に違和感がある場合は、[原文(英語)](https://doc.flix.dev/associated-types.html)を参照してください。

関連型(Associated type)とは、トレイトの型メンバーであり、各トレイトインスタンスごとに指定されるものです。関連型は、[多引数型クラス](https://en.wikipedia.org/wiki/Type_class#Multi-parameter_type_classes)に代わる、より自然な選択肢と見なされることがよくあります。
関連型(Associated type)とは、トレイトの型メンバであり、各トレイトインスタンスごとに指定されるものです。関連型は、[多引数型クラス](https://en.wikipedia.org/wiki/Type_class#Multi-parameter_type_classes)に代わる、より自然な選択肢と見なされることがよくあります。

例を使って関連型を説明します。

Expand Down
2 changes: 1 addition & 1 deletion src/build-and-packages.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

> 💡 **お知らせ**: このドキュメントはAIによって翻訳されています。表現に違和感がある場合は、[原文(英語)](https://doc.flix.dev/build-and-packages.html)を参照してください。

Flix にはビルドシステム(Build system)とパッケージマネージャ(Package manager)が付属しています。ビルドシステムを使うと、Flix プログラムを Java クラスの集まりにコンパイルしたり、fat JAR(ファットジャー)をビルドしたりすることが簡単にできます。パッケージマネージャを使うと、Flix パッケージを作成して GitHub に公開し、マニフェストファイル(Manifest file)を介してそれらに依存することができます。また、パッケージマネージャによって、Maven で公開されている Java の JAR アーティファクトに依存することも可能です。
Flix にはビルドシステム(Build system)とパッケージマネージャ(Package manager)が付属しています。ビルドシステムを使うと、Flix プログラムを Java クラスの集まりにコンパイルしたり、fat JAR(ファット JAR)をビルドしたりすることが簡単にできます。パッケージマネージャを使うと、Flix パッケージを作成して GitHub に公開し、マニフェストファイル(Manifest file)を介してそれらに依存することができます。また、パッケージマネージャによって、Maven で公開されている Java の JAR アーティファクトに依存することも可能です。

Flix のビルドシステムは、以下のコマンドをサポートしています:

Expand Down
4 changes: 2 additions & 2 deletions src/calling-methods.md
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ def f(): String \ IO =

`o` の型が不明であるため、`String.valueOf(boolean)`、`String.valueOf(char)`、`String.valueOf(double)`、あるいはその他のオーバーロードされたバージョンのどれを呼び出したいのか、Flix には分かりません。

解決策は、該当する引数に型指定(type ascription)を付けることです:
解決策は、該当する引数に型注釈(type ascription)を付けることです:

```flix
import java.lang.{String => JString}
Expand All @@ -119,7 +119,7 @@ def f(): String \ IO =
JString.valueOf((o: Bool))
```

この型指定は `o` が `Bool` 型であることを指定しており、これによってメソッド解決を正常に完了できるようになります。なお、追加の括弧のペアが必要であることに注意してください。
この型注釈は `o` が `Bool` 型であることを指定しており、これによってメソッド解決を正常に完了できるようになります。なお、追加の括弧のペアが必要であることに注意してください。

## 純粋であると分かっている Java メソッドの呼び出し

Expand Down
6 changes: 3 additions & 3 deletions src/chains-and-vectors.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

> 💡 **お知らせ**: このドキュメントはAIによって翻訳されています。表現に違和感がある場合は、[原文(英語)](https://doc.flix.dev/chains-and-vectors.html)を参照してください。

Flix は不変な `List` に加えて、不変な `Chain` と `Vector` もサポートしています。
Flix はイミュータブルな `List` に加えて、イミュータブルな `Chain` と `Vector` もサポートしています。

次の表は、list、chain、vector のあいだの性能上のトレードオフを示しています:

Expand All @@ -22,7 +22,7 @@ Flix は不変な `List` に加えて、不変な `Chain` と `Vector` もサポ

## Chains

`Chain[t]` は、要素の不変な連結シーケンスです
`Chain[t]` は、要素のイミュータブルな連結シーケンスです

`Chain[t]` データ型は次のように定義されています:

Expand All @@ -49,7 +49,7 @@ println(c)

## Vectors

`Vector[t]` は、型 `t` の連続した要素からなる、不変で固定長のシーケンスです
`Vector[t]` は、型 `t` の連続した要素からなる、イミュータブルで固定長のシーケンスです

Flix は `Vector` リテラルをサポートしています。たとえば、次のように書けます:

Expand Down
2 changes: 1 addition & 1 deletion src/concurrency.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def main(): Unit \ IO =

## チャネルによる通信

プロセス間で通信するには、チャネルを使用します。*チャネル(Channel)*を使うと、2つ以上のプロセスが互いに不変(イミュータブル)なメッセージを送り合うことで、データを交換できます。
プロセス間で通信するには、チャネルを使用します。*チャネル(Channel)*を使うと、2つ以上のプロセスが互いにイミュータブルなメッセージを送り合うことで、データを交換できます。

チャネルには、*バッファ付き(Buffered)*と*バッファなし(Unbuffered)*の2つの種類があります。チャネルは必ずリージョンに関連付けられます。

Expand Down
2 changes: 1 addition & 1 deletion src/debugging.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ def sum(x: Int32, y: Int32): Int32 =
4 |> result
```

問題は、`println` が `IO` エフェクトを持つことです。そのため、純粋な関数の中でプリントデバッグ(Print debugging)のために `println` を使うことはできません。`sum` 関数に `IO` エフェクトを持たせることもできますが、それが望ましいことはめったにありません。その代わりに、Flix にはプリント行デバッグを可能にする組み込みのデバッグ機能が用意されています
問題は、`println` が `IO` エフェクトを持つことです。そのため、純粋な関数の中でプリントデバッグ(Print debugging)のために `println` を使うことはできません。`sum` 関数に `IO` エフェクトを持たせることもできますが、それが望ましいことはめったにありません。その代わりに、Flix にはプリントデバッグを可能にする組み込みのデバッグ機能が用意されています

## `Debug.dprintln` 関数

Expand Down
16 changes: 8 additions & 8 deletions src/effect-polymorphism.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,35 +129,35 @@ def recoverWith(f: Unit -> a \ Throw, h: ErrMsg -> a \ (ef - Throw)): a = ...

ここで `recoverWith` 関数は2つの関数引数を取ります。例外を投げる可能性のある関数 `f` と、そのエラーを処理できるハンドラ `h` です。注目すべきは、エフェクトシステムが `h` 自身は例外を投げられないことを強制する点です。

## サブエフェクト
## サブエフェクティング

> **注意:** この機能はまだ有効化されていません。

Flix は _サブエフェクト_ をサポートしており、これによって式や関数がそのエフェクト集合を _広げる_ ことができます。
Flix は _サブエフェクティング_ をサポートしており、これによって式や関数がそのエフェクト集合を _広げる_ ことができます。

例えば、次のように書いた場合を考えます。

```flix
if (???) { x -> x + 1 } else { x -> {println(x); x + 1}}
```

最初の分岐は型 `Int32 -> Int32 \ { }`(つまり純粋)を持つはずであり、一方で2番目の分岐は型 `Int32 -> Int32 \ { IO }` を持ちます。サブエフェクトがなければ、`{ } != { IO }` であるためこれら2つの型は互換性がありません。しかし、サブエフェクトのおかげで、Flix は最初の分岐に新しいエフェクト変数 `ef` を用いた型 `Int32 -> Int32 \ ef` を与えます。これによって型推論は最初の分岐のエフェクトを `IO` に _広げる_ ことができます。したがってコンパイラは式全体を型検査できます。
最初の分岐は型 `Int32 -> Int32 \ { }`(つまり純粋)を持つはずであり、一方で2番目の分岐は型 `Int32 -> Int32 \ { IO }` を持ちます。サブエフェクティングがなければ、`{ } != { IO }` であるためこれら2つの型は互換性がありません。しかし、サブエフェクティングのおかげで、Flix は最初の分岐に新しいエフェクト変数 `ef` を用いた型 `Int32 -> Int32 \ ef` を与えます。これによって型推論は最初の分岐のエフェクトを `IO` に _広げる_ ことができます。したがってコンパイラは式全体を型検査できます。

別の例として、次を考えます。

```flix
def handle(f: Unit -> a \ (ef + Throw)): a = ...
```

ここで `handle` 関数は `Throw` エフェクトを持つ関数引数 `f` を期待します。しかし、サブエフェクトのおかげで、純粋な関数を使って `handle` 関数を呼び出すこともできます。つまり、次の通りです。
ここで `handle` 関数は `Throw` エフェクトを持つ関数引数 `f` を期待します。しかし、サブエフェクティングのおかげで、純粋な関数を使って `handle` 関数を呼び出すこともできます。つまり、次の通りです。

```flix
def handle(x -> Throw.throw(x)) // OK。`Throw` エフェクトを持つ。
def handle(x -> x) // OK。サブエフェクトによる
def handle(x -> x) // OK。サブエフェクティングによる
def handle(x -> println(x)) // NG。handle は `IO` を許可しない。
```

Flix はインスタンス宣言でもサブエフェクトを許可します
Flix はインスタンス宣言でもサブエフェクティングを許可します

例えば、次のトレイトを定義できます。

Expand All @@ -177,7 +177,7 @@ instance Foo[Int32] {

`f` の宣言されたエフェクトは `IO` ですが、ここでの `f` の実装は純粋です(つまり、空のエフェクト集合 `{ }` を持ちます)。`{ }` は `IO` に広げることができるため、このプログラムは依然として型検査を通ります。

しかし、Flix はトップレベル関数についてはサブエフェクトを許可しません
しかし、Flix はトップレベル関数についてはサブエフェクティングを許可しません

例えば、次の関数を宣言した場合を考えます。

Expand All @@ -197,7 +197,7 @@ Flix コンパイラは次のエラーメッセージを出力します。
expression has unexpected type.
```

まとめると、Flix は2つの場合にエフェクトの拡大を許可します。(a) ラムダ式と (b) インスタンス定義です。これを、Flix は _抽象化サイトのサブエフェクト__インスタンス定義のサブエフェクト_ をサポートしている、と言います。
まとめると、Flix は2つの場合にエフェクトの拡大を許可します。(a) ラムダ式と (b) インスタンス定義です。これを、Flix は _抽象化サイトのサブエフェクティング__インスタンス定義のサブエフェクティング_ をサポートしている、と言います。

<!--
# Effect Polymorphism
Expand Down
19 changes: 9 additions & 10 deletions src/effect-system.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@

Flix は、言語に完全に統合された最先端の型およびエフェクトシステム
(type and effect system)を備えています。Flix のエフェクトシステムは
強力かつ広範であり、effect polymorphism(エフェクト多相)、
sub-effecting(サブエフェクティング)、effect exclusion(エフェクト排他)、
purity reflection(純粋性リフレクション)、associated effects(関連エフェクト)を
強力かつ広範であり、エフェクト多相(effect polymorphism)、
サブエフェクティング(sub-effecting)、エフェクト除外(effect exclusion)、
純粋性リフレクション(purity reflection)、関連エフェクト(associated effects)を
サポートしています。

これらの新しく刺激的な機能については、以降のページで探っていきます。
Expand All @@ -16,7 +16,7 @@ purity reflection(純粋性リフレクション)、associated effects(関
- **(純粋性 / Purity)** 型およびエフェクトシステムは、純粋(pure)な関数と
純粋でない(impure)関数を分離します。Flix では、純粋な関数は一切の副作用を
持つことができず、同じ引数を与えられたときには同じ値を返さなければなりません。
とはいえ、純粋な関数であっても、mutable なデータ構造を使って命令型スタイルで
とはいえ、純粋な関数であっても、ミュータブルなデータ構造を使って命令型スタイルで
実装することは可能です。ただし、それらのデータ構造が関数の終了時にスコープから
外れる場合に限ります。

Expand All @@ -30,7 +30,7 @@ purity reflection(純粋性リフレクション)、associated effects(関
よって検査されるドキュメントとしての役割を果たします。

- **(エフェクトとハンドラ / Effects and Handlers)** 型およびエフェクトシステムは、
代数的エフェクト(algebraic effects)とハンドラ(handler)の基盤となります。
代数エフェクト(algebraic effects)とハンドラ(handler)の基盤となります。
これらによって、プログラマは例外(exception)、async/await、協調的マルチタスク
(cooperative multitasking)といった独自の制御構造を実装できるようになります。

Expand Down Expand Up @@ -58,12 +58,11 @@ Flix の型およびエフェクトシステムはかなり洗練されており

先に進む前に、Flix には 3 種類のエフェクトがあることを理解しておくことが重要です。

- [primitive effects](./primitive-effects.md)
- [algebraic effects](./effects-and-handlers.md)
- [heap effects](./mutable-data.md)
- [プリミティブエフェクト](./primitive-effects.md)
- [代数エフェクト](./effects-and-handlers.md)
- [ヒープエフェクト](./mutable-data.md)

トレイト(trait)とエフェクトがどのように相互作用するかについては、[Associated
Effects](./associated-effects.md) の節で説明します。
トレイト(trait)とエフェクトがどのように相互作用するかについては、[関連エフェクト](./associated-effects.md) の節で説明します。

## ダイレクトスタイル

Expand Down
Loading
Loading