Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

後半少し訳しました。 #1

Merged
merged 1 commit into from
Feb 15, 2012
Merged

Conversation

scova0731
Copy link

@okapies

最後のTwitterの章を除いて後ろの方から訳してみました。
お役に立てたら嬉しいです。

Watch ありがとうございました。@scova0731 は店じまいしまして、
早速Forkさせて頂きました。勢いで翻訳を始めてしまったのですが、
この英語、やっぱり普通より手強いですよね?
(自分の力量はさておき。。。)

…ion, Traits, Visibility, Structural typing

Garbage collection, Java compatibility
.LP <code>foo()</code> の呼び出し側は、戻されたインスタンスの限定されたビュー(<code>Foo with Bar</code>) が参照できる

### 構造的型(?正確な訳?)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

structural subtyping と書かれてることが多くて、それだと大抵 構造的部分型 と訳されるのが定番な気がしますが、これ原文が Structural typing ですね・・・。どうしたほうがいいんだろう?
Scalaにあるのは structural subtyping だった気がしますが。
というか、そもそも structural subtypingstructural typing って用語として異なるものなのかどうなのか。
そのあたりは、自分は全然自信がないので、識者の意見求む(´・ω・`)

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

同じです。「構造的部分型」という訳語は長くて意味不明なので嫌いな訳語の一つですが、定訳でしょう。カッコ付きで (structural type) と書いてくれると助かるかも。structural な宣言を使って型を派生させることを structural subtyping と言い、その宣言部分を口語では普通 structural type と言います。
structural な宣言とは、複合型 (T1 with . . . with Tn {R } の形を取る型) のうち、Tx 内に現れない宣言のことです。多分。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ご教示ありがとうございます。とりあえず、「構造的部分型」で統一しようと思います。
あと、略語としての言いやすさを措いて、なるべく正確に表現するとどういう訳語になるんでしょうか…。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

なるべく正確に表現するとどういう訳語になるんでしょうか…。

structural type を仕様に基づいて表現してそれを訳するとどうなるか、という意味だと解釈します。"structural refinement" というパッと聞きでは誰も意味が分からない表現になり、その訳語は「構造的な細別」みたいです (T1 with . . . with Tn {R } の R は refinement の R)。
Effective Scala は実用書なので、プログラマ相手に意味が通じることが第一なので、個人的には構造的部分型でも英語のまま structural type でもいいと思います。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

"(mix-inした他の宣言済みの型(T1...Tn)とは別に)structuralなrefinementを含む型"を、略して"structural subtyping"とか"structural type"とか呼んでいる、というイメージで良いでしょうか?
確かに、略語の表記方針は統一したほうが良いですね、検討します。

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

まぎらわしかったので、文面をちと修正(@12:09)。

「structural type」という言葉ですが、まず、少なくとも「Scala界隈では」 @eed3si9n の仰る通り、「strucltrural subtyping」と同じ意味と考えてほぼ間違いないです。ですから、訳に関してはどちらをベースにしても特に問題ないかと。「structural subtyping」なら「構造的部分型」が訳語としては一般的です(これの善し悪しはともかく)。いっぽう、「structural type」については、定訳を聞いた事がありませんが、直訳風味で「構造的な型」 or 「構造的型」辺りで良いのではないかと思います。この記事での「structural type」という用語の訳に関してはそれくらいでしょうか。

以下、「型システムに関する一般論としての」うんちくです。翻訳の上ではどーでもよいので、てきとーに無視してください。


まず、サブタイプの話をしている、という前提無しに「structural type」とだけ言っちゃうと、サブタイプ関係を考慮しない用語とし てとられる可能性があります。ですから、私の場合は、曖昧性が生じないように、Scalaの「structural type」について説明するときも、特に相手がScala使いでなければ「structural subtyping」のように言うことが多いです。

元々、サブタイプ関係を決定するためのシステムには、大別して「structural subtyping」(構造的部分型)と「nominal subtyping」(名前的部分型)の二つがあります。これは、「サブタイプ関係を決定するためのシステム」に関する用語なので、-typingとなっていて、本当は「構造的部分型」と名詞的に言ってしまうのは、イマイチな気はしますが。

前者は、型Aが型Bのサブタイプである ( A <: B ) かどうかが、それぞれのデータ型のメンバの包含関係によって暗黙に決定されるようなシステムを、後者は、型Aが型Bのサブタイプであるかが明示的な宣言(これはScalaだとextendsだったりwithだったりします)に基づいて決定されるものです。

ふつーの静的型付けオブジェクト指向言語において、サブタイプ関係を決定するためのシステムは、ほとんどの場合nominal(Java, C#, ...,C++もtemplate周りの話を除けば、nominal)です。これはScalaでも例外ではありません。ただ、Scalaの場合、2.6で、言語機能としての「structural type」が入った事ために、サブタイプ関係のシステムは、nominalとstructuralのキメラになりました。

これはどーいうことかといいうと、たとえば、

val hoge: A { def hoge(): Unit } = ... // A はクラスまたはトレイトと仮定。A自体がstructural refinementのaliasだったりすると、またややこしいので以下略

という変数を宣言した場合、「Aを直接・間接に明示的に継承しており、かつ、hoge():Unitメソッドを持った型」という意味になります。

さて、以上はサブタイプがある言語の場合の話ですが、一方で、サブタイプが無い言語でも、型付けに関して「structural」と「nominal」という用語は歴史的に使われてきました。そういう文脈では、「structural」「nominal」は、二つの型が「同じ型かどうか」を判定するための方法を意味する用語になります。「structural」では、二つの型(普通、構造体)のメンバ集合が完全に一致している必要が、「nominal」では、二つの「型の名前」が一致している必要があります。「structural subtyping」や「nominal subyping」というのは、サブタイプが無い頃からあった、型システムの同一性を判定するための、この二つの方法を拡張したものといえます。


Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

詳しい解説をありがとうございます。大変勉強になりました。

用語としては"nominal"に対応するもの、という文脈を抜かして"structural"(構造的)という言葉を見ると、意味が広すぎるのが敗因なんでしょうね。どうしても、「構造がない型って何だよ…」という気分になってしまう(笑。

あるいは、"typing"を正確に訳して「構造的部分型付け」とか? さらに長くなって誰が得をするんだという感じですが。

okapies added a commit that referenced this pull request Feb 15, 2012
後半少し訳しました。
@okapies okapies merged commit 10e8ad6 into scalajp:master Feb 15, 2012
@okapies
Copy link
Member

okapies commented Feb 15, 2012

どうもありがとうございます。勝手ながら、翻訳者に名前を足しておきました。
私もそんなに得意ではないのでアレですが、心構えを説くのがメインで、技術論文ぽくない感じですね。xuwei-kさんのご指摘については、後でもう一回見直してみます。

@scova0731
Copy link
Author

GitHub上で完結しているので、こういったフィードバックは訳注として本文にリンクを貼るのが良いかもしれないですね。経緯とか背景とか臨場感っぽさが後から読む人に伝わるといいと思いますし、何より勿体ないですね。素晴らしいです。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants