スカラの初心者を完了し、今すぐ基本を理解しようとしています。スカラ型不一致ユニットの代わりに
私はチュートリアルの一部として、整数リストの中で最大の要素を返す関数を作成しようとしています。これを実現するために、私は、(仮称)しました一緒に次のコードを置く:私はそれをコンパイルしようとしたとき、私は私が持っているライン5
[error] /scala/example/src/main/scala/example/Lists.scala:5: type mismatch;
[error] found : Unit
[error] required: Int
[error] findMax(xs.head, xs.tail)
の型エラーを取得し、しかし
def max(xs: List[Int]): Int =
if (xs.isEmpty)
throw new java.util.NoSuchElementException
else
findMax(xs.head, xs.tail)
def findMax(a: Int, b: List[Int]) {
if (b.isEmpty) return a
if (a > b.head)
findMax(a, b.tail)
else
findMax(b.head, b.tail)
}
を私はこのエラーメッセージで混乱していることを認めています。コンパイラが、この行の前にリストが空でないことを保証するためにロジックを与えられたUnit型を渡そうとしていると、私は理解していません。
誰でも問題を明確にすることはできますか?
プロシージャ構文は、-Xfutureの下で廃止されました。私はこれが理由だと思う。 –
ありがとう、あなたは私が混乱していたよりもさらに多くのことを明らかにしました!フォローアップの質問をすることができますが、例外がスローされたときに返されるものについて説明できますか?具体的には、もともとは、if-else条件ではなく、ガード節の一部として2行目と3行目をまとめたかったのですが、これは型不一致(Intの代わりにUnit)を引き起こし、 "xs" findMax関数の呼び出しで使用される値はありません。 –
'throws'は非常に特殊なケースです。それは返されません。スローされた例外の型をキャッチしない '試行 'もしません。この場合、 'throws'または' try'の戻り値の型は 'Nothing'という特別な底の型です。 'Nothing'のインスタンスはありません。' Nothing 'でさえもNothingではありません。 'Nothing'はすべてのサブタイプであるので、あるブランチでは' Nothing'を返し、もう一つは 'Int'を返す' if'はその2つのブランチの最も一般的な型であるため、最終的に 'Int'を返します。 – Zeimyth