純粋関数型プログラミング言語ではOpaque Data Typeも全て純粋関数なので常に参照透過性があるそうだ。(詳細はこちらの記事が詳しい)
透明なのに不透明というのが面白くて言葉の意味を調べてみた。
透明: transparent
transparentは、物事が舞台裏で自動的に行われるという意味で(つまり、コードやプログラムのユーザーが対話する必要がないという意味で)、隠されるという意味
不透明: opaque
不透明な型という言葉は、C/C++では特定の意味を持っており、宣言されているがまだ定義されていない型を意味する
出典: stackoverflow:What do "transparent" and "opaque" mean when applied to programming concepts?
参照透過性: referencial transparency (wikipedia)
プログラムの動作を変えることなく、式を対応する値に置き換える(またはその逆)ことができるものを参照透過性と呼ぶ。このためには、式が純粋であること、つまり同じ入力に対して式の値が同じであり、その評価に副作用がないことが必要である。
参照不透明性1: referentially opaque (wikipedia)
参照透過性のない式は**参照不透明性1**と呼ばれます
Opaque data type (wikipedia)
具体的なデータ構造がインターフェースで定義されていないデータ型のこと。このデータ型の値を操作するには、不足している情報にアクセスできるサブルーチンを呼び出す必要があるため、情報の隠蔽が行われる。データ型の具体的な表現はユーザーから隠されており、目に見える実装は不完全です。不透明なデータ型は、抽象的なデータ型を実装するために頻繁に使用される。
常用の訳語
不透明な、光沢のない、くすんだ、はっきりしない、不明瞭な
透明な、透き通る、目の透いた、ごく薄い、平明な、わかりやすい、明白な、見え透いた、率直な、気取らない
参考の、参照の、参考用の、参照付きの
ScalaのOpaque type
Scala3の新機能の一つにはOpaque type aliasesがあり、略してOpaque Typesと呼ばれています。
実態は拡張メソッドを実装するもので、Scala2のimplicit classと値クラス(AnyVal)による実行時のオーバーヘッドを無くす仕組みを合わせたもののシンタックスシュガーです。
値クラスによる実行時のオーバーヘッド解消では、コンパイル時のみ型チェックを行い実行時には型がない状態になるのでパターンマッチではつかえません。
そういう前提で考えると、opaque(不透明)=「宣言されているが定義されていない」という元の意味とつながり、普通のtype aliasがtransparentで対になっているように思えます。