Spec2.8Chap6d

6.26 暗黙の変換 (Implicit Conversions)

Implicit conversions can be applied to expressions whose type does not match their expected type, as well as to unapplied methods . The available implicit conversions are given in the next two sub-sections .

We say, a type T is compatible to a type U if T conforms to U after applying etaexpansion (§6.26.5) and view applications (§7.3) .

暗黙の変換は、その型が要請型と一致しない式に、 (引数リストに)適用されていないメソッドにも同様に、適用されます。 利用可能な暗黙の変換については、以降の 2 つの副節で述べます。

もし 型 T がイータ展開 (§6.26.5)とビュー適用 (§7.3)の後で型 U に適合するなら、 型 T は型 U に 互換(compatible) であると言います。



6.26.1 値変換 (Value Conversions)

The following five implicit conversions can be applied to an expression e which has some value type T and which is type-checked with some expected type pt .

ある値型 T をもち、ある要請型 pt で型チェックされる式 e に対して、 次の 5 つの暗黙の変換が適用されます。


オーバーロード解決 (overloading resolution)

If an expression denotes several possible members of a class, overloading resolution (§6.26.3) is applied to pick a unique member .

もし式がクラスの複数の可能なメンバーを表すなら、 ただ 1 つのメンバーを選ぶために、オーバーロード解決 (§6.26.3) が適用されます。


型インスタンス化 (Type Instantiation)

式 e は次の多相型で

   [a1 >: L1 <: U1,...,an >: Ln <: Un]T

which does not appear as the function part of a type application is converted to a type instance of T by determining with local type inference (§6.26.4) instance types T1,...,Tn for the type variables a1,...,an and implicitly embedding e in the type application e[T1,...,Tn] (§6.8) .

型適用の関数部分としては現れないとします。 式 e は T のインスタンスの型へ変換されますが、それは、ローカルな型推論 (§6.26.4) を用いて型変数 a1,...,an のインスタンス型 T1,...,Tn を決定し、 e を型適用 e[T1,...,Tn] 中に 暗黙のうちに埋め込む (§6.8)ことでなされます。


数の拡張 (Numeric Widening)

If e has a primitive number type which weakly conforms (§3.5.3) to the expected type, it is widened to the expected type using one of the numeric conversion methods toShort, toChar, toInt, toLong, toFloat, toDouble defined in §12.2.1 .

もし e が、要請型に弱く適合 (§3.5.3)するプリミティブな数値型なら、 §12.2.1 で定義された数値変換メソッド toShort、toChar、toInt、toLong、 toFloat、toDouble の 1 つを使って要請型に拡張されます。


数値リテラルの縮小 (Numeric Literal Narrowing)

If the expected type is Byte, Short or Char, and the expression e is an integer literal fitting in the range of that type, it is converted to the same literal in that type .

もし要請型が Byte、Short あるいは Char であり、 式 e がそれらの型の範囲の整数リテラルなら、 その型の同じリテラルに変換されます。


値の廃棄 (Value Discarding)

If e has some value type and the expected type is Unit, e is converted to the expected type by embedding it in the term { e ; () } .

もし e がある値型で要請型が Unitなら、 e は、それを項 { e ; () } の中へ埋め込むことで要請型に変換されます。


ビュー適用 (View Application)

If none of the previous conversions applies, and the e's type does not conform to the expected type pt, it is attempted to convert e to the expected type with a view (§7.3) .

もし前記変換のいずれも適用されず、e の型が要請型 pt に適合しないなら、 ビュー(§7.3)を使って e を要請型に変換することが試みられます。



6.26.2 メソッド変換 (Method Conversions)

The following four implicit conversions can be applied to methods which are not applied to some argument list .

つぎの 4 つの暗黙の変換が、ある引数リストに適用されないメソッドに適用されます。


評価 (Evaluation)

A parameterless method m of type => T is always converted to type T by evaluating the expression to which m is bound .

パラメータなしの、型 => T のメソッド m は常に、m が束縛される式へ評価することで、 型 T へ変換されます。


暗黙の適用 (Implicit Application)

If the method takes only implicit parameters, implicit arguments are passed following the rules of §7.2 .

もしメソッドが暗黙のパラメータのみをとるなら、暗黙の引数が §7.2 の規則に従って 渡されます。


イータ展開 (eta expansion)

Otherwise, if the method is not a constructor, and the expected type pt is a function type (Ts´) ⇨ T´ , eta-expansion (§6.26.5) is performed on the expression e .

そうでなければ、もしメソッドがコンストラクタでなく、 要請型 pt が関数型 (Ts´) ⇨ T´なら、式 e のイータ展開 (§6.26.5)が実行されます。


空の適用 (Empty Application)

Otherwise, if e has method type ()T , it is implicitly applied to the empty argument list, yielding e() .

そうでなければ、もし e がメソッド型 ()T なら、 それは暗黙のうちに空の引数リストに適用され、e() をもたらします。



6.26.3 オーバーロード解決 (Overloading Resolution)

If an identifier or selection e references several members of a class, the context of the reference is used to identify a unique member . The way this is done depends on whether or not e is used as a function . Let AA be the set of members referenced by e .

もし識別子あるいは選択 e がクラスの複数のメンバーを参照するなら、 ただ 1 つのメンバーを決定するために、参照のコンテキストが使われます。 この方法は e が関数として使用されるかどうかによります。 AA を、e によって参照されるメンバーの集合とします。

Assume first that e appears as a function in an application, as in e(e1,...,em) .

One first determines the set of functions that is potentially applicable based on the shape of the arguments .

最初に、e は適用中に関数として、 たとえば e(e1,...,em) のように現れると仮定します。

まず、引数の 形状(shape) に基づいて潜在的に適用可能な関数の集合を決定します。

The shape of an argument expression e, written shape(e), is a type that is defined as follows:

  • For a function expression (p1 : T1,...,pn : Tn) => b:(Any,...,Any) => shape(b), where Any occurs n times in the argument type .
  • For a named argument n = e: shape(e) .
  • For all other expressions: Nothing .

引数式 e の形状は、shape(e) と書き、次のように定義される型です。:

  • 関数式 (p1 : T1,...,pn : Tn) => b に対し : (Any,...,Any) => shape(b)。ここで Any は引数型中に n 回現れます。
  • 名前付き引数 n = e に対し : shape(e)
  • 他のすべての式に対し : Nothing

Let BB be the set of alternatives in AA that are applicable (§6.6) to expressions (e1,...,en) of types (shape(e1),..., shape(en)). If there is precisely one alternative in BB, that alternative is chosen .

BB を、型 (shape(e1),...,shape(en)) の式 (e1,...,en) へ 適用可能 (§6.6)な、AA 中の代替物の集合とします。 もし BB 中に 正確に 1 つの代替物があるなら、その代替物が選ばれます。

Otherwise, let S1,...,Sm be the vector of types obtained by typing each argument with an undefined expected type . For every member m in BB one determines whether it is applicable to expressions (e1,...,em) of types S1,...,Sm . It is an error if none of the members in BB is applicable . If there is one single applicable alternative , that alternative is chosen . Otherwise, let CC be the set of applicable alternatives which don't employ any default argument in the application to e1,...,em . It is again an error if CC is empty . Otherwise, one chooses the most specific alternative among the alternatives in CC , according to the following definition of being "as specific as", and "more specific than":

そうでなければ、S1,...,Sm を、各引数を未定義の要請型で型付けして得られる、 型のベクトルとします。 BB 中のすべてのメンバー m に対して、それが型 S1,...,Sm の式 (e1,...,em) に適用可能かどうかを決定します。 もし BB 中のどのメンバーも適用可能でないなら、エラーです。 もし ただ 1 つの適用可能な代替物があるなら、その代替物が選ばれます。 そうでなければ、CC を、e1,...,em への適用中でデフォルト引数を使用しない適用可能な代替物の集合とします。 もし CC が空なら、それは再びエラーです。 そうでなければ、CC 中の代替物の中で 最も特化した 代替物を選びます。 ここで「同じくらい特化した」、「より特化した」という定義は次です。

  • A parameterized method m of type (p1 : T1,...,pn : Tn)U is as specific as some other member m´ of type S if m´ is applicable to arguments (p1,...,pn) of types T1,...,Tn .
  • A polymorphic method of type [a1 >: L1 <: U1,...,an >: Ln <: Un]T is as specific as some other member of type S if T is as specific as S under the assumption that for i = 1,...,n each ai is an abstract type name bounded from below by Li and from above by Ui .
  • A member of any other type is always as specific as a parameterized method or a polymorphic method .
  • Given two members of types T and U which are neither parameterized nor polymorphic method types, the member of type T is as specific as the member of type U if the existential dual of T conforms to the existential dual of U . Here, the existential dual of a polymorphic type [a1 >: L1 <: U1,...,an >: Ln <: Un]T is T forSome { type a1 >: L1 <: U1,...,type an >: Ln <: Un }. The existential dual of every other type is the type itself .
  • 型(p1 : T1,...,pn:Tn)U のパラメータ化されたメソッド m が、型 S の他のあるメンバー m´と同じくらい特化しているとは、m´が型 T1,...,Tn の引数 (p1,...,pn)に適用可能な場合をいいます。
  • 型 [a1 >: L1 <: U1,...,an >: Ln <: Un]T の多相的メソッドが、型 S の 他のあるメンバーと同じくらい特化しているとは、i = 1,...,n について各 ai が 下から Li によって、上から Ui によって境界付けられている抽象型名であるという仮定の下、T が S と同じぐらい特化している場合をいいます。
  • 他のすべての型のメンバーは常に、パラメータ化されたメソッドあるいは多相的メソッドと同じぐらい特化しています。
  • パラメータ化されておらず多相的メソッド型でもない型 T と U の 2 つの与えられたメンバーについて、もし T の存在的双対が U の存在的双対に適合するなら、型 T のメンバーは型 U のメンバーと同じぐらい特化しています。ここで、多相型 [a1 >: L1 <: U1,...,an >: Ln <: Un]T の存在的双対とは、T forSome { type a1 >: L1 <: U1,...,type an >: Ln <: Un } です。他のすべての型の存在的双対はその型自身です。

The relative weight of an alternative A over an alternative B is a number from 0 to 2, defined as the sum of

  • 1 if A is as specific as B , 0 otherwise, and
  • 1 if A is defined in a class or object which is derived from the class or object defining B , 0 otherwise .

代替物 Bに対する代替物 A の 相対的重み は、0 から 2 までの数値で、 次の 2 項の和として定義されます。

  • もし A が B と同じぐらい特化しているなら 1、そうでなければ 0。
  • もし A が、B を定義しているクラス/オブジェクトから派生するクラス/オブジェクト内で定義されているなら 1、そうでなければ 0。

A class or object C is derived from a class or object D if one of the following holds:

  • C is a subclass of D, or
  • C is a companion object of a class derived from D, or
  • D is a companion object of a class from which C is derived .

もし次の 1 つが満たされるなら、クラス/オブジェクト C は、 クラス/オブジェクト D から 派生 されます:

  • C は D のサブクラス。あるいは、
  • C は D から派生したクラスのコンパニオンオブジェクト。あるいは、
  • D は C の派生元クラスのコンパニオンオブジェクト。

An alternative A is more specific than an alternative B if the relative weight of A over B is greater than the relative weight of B over A .

It is an error if there is no alternative in CC which is more specific than all other alternatives in CC .

もし B に対する A の相対的重みが、A に対する B の相対的重みより大きいなら、 代替物 A は代替物 B より特化 しています。

もし CC 中の他のすべての代替物より特化した代替物が CC 中に一つもないなら、 エラーです。

Assume next that e appears as a function in a type application, as in e[targs]. Then all alternatives in AA which take the same number of type parameters as there are type arguments in targs are chosen . It is an error if no such alternative exists . If there are several such alternatives, overloading resolution is applied again to the whole expression e[targs] .

次に、e が型適用の中で関数として、たとえば e[targs] のように現れると仮定します。 このとき、targs 中の型引数と同じ個数の型パラメータをとる、 AA 中のすべての代替物を選びます。 もしそのような代替物がないなら、エラーです。 もしそのような代替物が複数あるなら、オーバーロード解決を再び式全体 e[targs] に適用します。

Assume finally that e does not appear as a function in either an application or a type application . If an expected type is given, let B be the set of those alternatives in AA which are compatible (§6.26) to it . Otherwise, let BB be the same as AA . We choose in this case the most specific alternative among all alternatives in BB . It is an error if there is no alternative in BB which is more specific than all other alternatives in BB .

最後に、e は適用あるいは型適用のいずれのうちにも関数として現われないと仮定します。 もし要請型が与えられていれば、それに互換 (§6.26)な AA 中の代替物の集合を BB とします。 そうでなければ、BB を AA と同じとします。 この場合、BB 中のすべての代替物の中から最も特化した代替物を選びます。 もし BB 中の他のすべての代替物より特化した代替物が BB 中に一つもないなら、 エラーです。


Example 6.26.1 次の定義を考えます。

   class A extends B {}
   def f(x: B, y: B) = ...
   def f(x: A, y: B) = ...
   val a: A
   val b: B

Then the application f(b, b) refers to the first definition of f whereas the application f(a, a) refers to the second . Assume now we add a third overloaded definition

このとき、適用 f(b、b)は f の最初の定義を参照するのに対して、 適用 f(a、a) は 2 番目を参照します。 ここで次の、3 番目のオーバーロードされた定義を加えるとします。

   def f(x: B, y: A) = ...

Then the application f(a, a) is rejected for being ambiguous, since no most specific applicable signature exists .

そうすると、適用 f(a、a) は、最も特化した適用可能なシグニチャが存在しないため、 曖昧であるとして却下されます。



6.26.4 ローカルな型推論 (Local Type Inference)

Local type inference infers type arguments to be passed to expressions of polymorphic type . Say e is of type [a1 >: L1 <: U1,...,an >: Ln <: Un]T and no explicit type parameters are given .

ローカルな型推論は、多相型の式に渡す型引数を推論します。 たとえば、e の型を型 [a1 >: L1 <: U1,...,an >: Ln <: Un]T とし、 明示的な型パラメータが与えられていないとします。

Local type inference converts this expression to a type application e[T1,...,Tn] . The choice of the type arguments T1,...,Tn depends on the context in which the expression appears and on the expected type pt . There are three cases .

ローカルな型推論は、この式を型適用 e[T1,...,Tn] へ変換します。 型引数 T1,...,Tn の取捨は、式が現われるコンテキストと要請型 pt に依存します。 3 つの場合があります。


Case 1: 選択 (Selections)

If the expression appears as the prefix of a selection with a name x, then type inference is deferred to the whole expression e.x . That is, if e.x has type S, it is now treated as having type [a1 >: L1 <: U1,...,an >: Ln <: Un]S, and local type inference is applied in turn to infer type arguments for a1,...,an , using the context in which e.x appears .

もし式が、名前 x の選択の前置子として現われるなら、型推論は式 e.x 全体へ 持ち越され (deferred)ます。 すなわち、もし e.x が型 S を持つなら、 それは型 [a1 >: L1 <: U1,...,an >: Ln <: Un]S を持っているとして扱われ、 ローカルな型推論が今度は、e.x が現われるコンテキストを用いて a1,...,an の型引数の推論に使われます。


Case 2: 値 (Values)

If the expression e appears as a value without being applied to value arguments, the type arguments are inferred by solving a constraint system which relates the expression's type T with the expected type pt . Without loss of generality we can assume that T is a value type; if it is a method type we apply eta-expansion (§6.26.5) to convert it to a function type . Solving means finding a substitution σ of types Ti for the type parameters ai such that

もし式 e が、値引数へ適用されずに値として現われるなら、その型引数の推論は、 要請型 pt をもつ式の型 T にかかわる制約システムを解決することでなされます。 一般性を失うことなく、T は値型であると仮定できます。; つまり、もしそれがメソッド型なら、イータ展開 (§6.26.5) を適用して関数型に変換します。 ここで解決とは次のような、型パラメータ ai に対する型 Ti の置換 σ を見つけることです。

  • All type parameter bounds are respected, i.e. σLi <: σai and σai <: σUi for i = 1,...,n .
  • The expression's type conforms to the expected type, i.e. σT <: σpt .
  • すべての型パラメータ境界を順守する。すなわち、i = 1,...,n に対して σLi <: σai かつ σai <: σUi 。
  • 式の型は要請型に適合する。すなわち、σT <: σpt

It is a compile time error if no such substitution exists . If several substitutions exist, local-type inference will choose for each type variable ai a minimal or maximal type Ti of the solution space . A maximal type Ti will be chosen if the type parameter ai appears contravariantly (§4.5) in the type T of the expression . A minimal type Ti will be chosen in all other situations, i.e. if the variable appears covariantly, nonvariantly or not at all in the type T . We call such a substitution an optimal solution of the given constraint system for the type T .

もしそのような置換が存在しないなら、実行時エラーとなります。 もし複数の置換が存在するなら、ローカルな型推論は、 各型変数 ai に対して解空間の最小/最大の型 Ti を選びます。 もし型パラメータ ai が、式の型 T 中に反変的に (§4.5)現れるなら、 最大の型 Ti が選ばれます。 他のすべての状況、つまり、もし変数が共変的、不変的、 あるいはまったく型 T 中に現れなければ、 最小の型 Ti が選ばれます。 そのような置換を、型 T に対する与えられた制約システムの 最適解 と呼びます。


Case 3: メソッド (Methods)

The last case applies if the expression e appears in an application e(d1,...,dm). In that case T is a method type (p1 : R1,...,pm : Rm)T´ . Without loss of generality we can assume that the result type T´ is a value type; if it is a method type we apply eta-expansion (§6.26.5) to convert it to a function type . One computes first the types Sj of the argument expressions dj , using two alternative schemes . Each argument expression dj is typed first with the expected type Rj , in which the type parameters a1,...,an are taken as type constants . If this fails, the argument dj is typed instead with an expected type R´j which results from Rj by replacing every type parameter in a1,...,an with undefined .

もし式 e が適用 e(d1,...,dm) 中に現れるなら、最後のケースが適用されます。 この場合、T はメソッド型 (p1 : R1,...,pm:Rm)T´です。 一般性を失うことなく、結果型 T´ が値型であると仮定できます。; もしこれがメソッド型なら、我々はこれを関数型に変換するためにイータ展開 (§6.26.5)を適用します。 まず、2 つの選択スキームを使って、引数式 dj の型 Sj を計算します。 各引数式 dj は、最初に要請型 Rj で型付けされます。 そのとき、型パラメータ a1,...,an は型定数とみなされます。 もしこれが失敗するなら、引数 dj は、その代わりに要請型 R´j で型付けされます。 ここで R´j は、Rj を a1,...,an 中のすべての型パラメータを未定義で置き換えて得られるものです。

In a second step, type arguments are inferred by solving a constraint system which relates the method's type with the expected type pt and the argument types S1,...,Sm . Solving the constraint system means finding a substitution of types Ti for the type parameters ai such that

  • All type parameter bounds are respected, i.e. σLi <: σai and σai <: σUi for i = 1,...,n .
  • The method's result type T´ conforms to the expected type, i.e. σT´ <: σpt .
  • Each argument type weakly conforms (§3.5.3) to the corresponding formal parameter type, i.e. σSj <:w σRj for j = 1,...,m .

It is a compile time error if no such substitution exists . If several solutions exist, an optimal one for the type T´ is chosen .

2 つめのステップでは、型引数の推論は、要請型 pt および引数型 S1,...,Sm をもつ メソッド型にかかわる制約システムを解決することでなされます。 制約システムの解決とは、次のような、型パラメータ ai に対する型 Ti の置換を見つけることです。

  • すべての型パラメータ境界を順守する。すなわち、i = 1,...,n に対して σLi <: σai かつ σai <: σUi 。
  • メソッドの結果型 T´ は要請型に適合する。すなわち、σT´ <: σpt 。
  • 各引数型は、対応する形式上のパラメータ型に弱く適合(§3.5.3)する。すなわち j = 1,...,m に対して σSj <:w σRj 。

もしそのような置換が存在しないなら、実行時エラーとなります。 もし複数の解決が存在するなら、型 T´に対して最適なものが選ばれます。

All or parts of an expected type pt may be undefined . The rules for conformance (§3.5.2) are extended to this case by adding the rule that for any type T the following two statements are always true:

要請型 pt のすべてあるいは一部は未定義かもしれません。 この場合、適合性の規則(§3.5.2)は、 任意の型 T に対して次の 2 つの文が常に真である、 という規則を加えて拡張されます。:

   undefined <: T    と   T <: undefined

It is possible that no minimal or maximal solution for a type variable exists, in which case a compile-time error results . Because <: is a pre-order, it is also possible that a solution set has several optimal solutions for a type . In that case, a Scala compiler is free to pick any one of them .

型変数に対して最小/最大の解が存在しないことはあり得ます。 その場合、実行時エラーが生じます。 なぜなら、<: は前順序(pre-order)であり、 解集合が 1 つの型に対して複数の最適解を持つこともあるからです。 そのような場合 Scala コンパイラは、それらの 1 つを勝手に選びます。


Example 6.26.2 次 の 2 つのメソッドと定義について考えます。:

   def cons[A](x: A, xs: List[A]): List[A] = x :: xs
   def nil[B]: List[B] = Nil
   
   val xs = cons(1, nil)

The application of cons is typed with an undefined expected type . This application is completed by local type inference to cons[Int](1, nil). Here, one uses the following reasoning to infer the type argument Int for the type parameter a:

cons の適用は、未定義の要請型で型付けされます。 この適用は cons[Int](1、nil)へのローカルな型推論によって完成されます。 ここで次の論法を使って、型パラメータ a に対して型引数 Int を推論します。:

First, the argument expressions are typed . The first argument 1 has type Int whereas the second argument nil is itself polymorphic . One tries to type-check nil with an expected type List[a]. This leads to the constraint system

最初に、引数式が型付けされます。 最初の引数 1 は Int 型を持ち、他方、2 番目の引数 nil はそれ自身が多相的です。 要請型 List[a] で nil の型チェックを試みます。 これは次の制約システムを導きます。

   List[b?] <: List[a]

where we have labeled b? with a question mark to indicate that it is a variable in the constraint system . Because class List is covariant, the optimal solution of this constraint is

ここで、制約システム中の変数であることを示すクエスチョンマークのついた b? という印を使っています。 クラス List は共変なので、この制約の最適解は、

   b = scala.Nothing .

です。

In a second step, one solves the following constraint system for the type parameter a of cons:

2 つめのステップで、cons の型パラメータ a に対する次の制約システムを解きます。:

   Int <: a?
   List[scala.Nothing] <: List[a?]
   List[a?] <: undefined

この制約システムの最適解は次です。

   a = Int ,

ですから、Int が a の推論される型です。


Example 6.26.3 今度は、次の定義を考えます。

   val ys = cons("abc", xs)

where xs is defined of type List[Int] as before . In this case local type inference proceeds as follows .

ここで、xs は前に型 List[Int] と定義されています。 この場合、ローカルな型推論は次のように進みます。

First, the argument expressions are typed . The first argument "abc" has type String . The second argument xs is first tried to be typed with expected type List[a]. This fails, as List[Int] is not a subtype of List[a]. Therefore, the second strategy is tried; xs is now typed with expected type List[undefined]. This succeeds and yields the argument type List[Int] .

最初に、引数式が型付けされます。 最初の引数 "abc" は文字列型です。 2 番目の引数 xs は最初に、要請型 List[a] での型付けを試みられます。 List[Int] が List[a] のサブ型ではないので、これは失敗します。 このため、2 番目の戦略が試みられます。; xs は今度は、要請型 List[undefined] で型付けされます。 これは成功し、引数型 List[Int] をもたらします。

2 つめのステップで、cons の型パラメータに対する次の制約システムを解きます。:

   String <: a?
   List[Int] <: List[a?]
   List[a?] <: undefined

この制約システムの最適解は次です。

   a = scala.Any

ですから、scala.Any が推論される a の型です。



6.26.5 イータ展開 (Eta Expansion)

Eta-expansion converts an expression of method type to an equivalent expression of function type . It proceeds in two steps .

イータ展開 は、メソッド型の式を等価な関数型の式に変換します。 それは、2 つのステップで進みます。

First, one identifes the maximal sub-expressions of e; let's say these are e1,...,em . For each of these, one creates a fresh name xi . Let e´ be the expression resulting from replacing every maximal subexpression ei in e by the corresponding fresh name xi . Second, one creates a fresh name yi for every argument type Ti of the method (i = 1,...,n). The result of eta-conversion is then:

最初に、e の最大の部分式を識別します。;たとえば、それらが e1,...,em であるとします。それらの各々に対し、新規の名前 xi を生成します。 e´を、e 中のすべての最大の部分式 ei を対応する新規の名前 xi で置き換えて得られる式とします。 次に、メソッドの各引数型 Ti(i = 1,...,n) に対して新規の名前 yi を生成します。 イータ変換の結果は次のようになります。

   { val x1 = e1 ;
       ...
     val xm = em ;
     ( y1 : T1,...,yn : Tn) => e´( y1,...,yn )
   }

タグ:

+ タグ編集
  • タグ:

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約 が適用されます。

最終更新:2011年02月23日 18:36
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。