上は「実践Scala入門」P82の例題です。下は自分の数少ない、知識を開けました。"(-""-)"再帰を使うのでスタックオバーフローに注意。定義をそのまま書けるので、結構大事そうですが、難しい面もありそうです。ですが、大事な処理は多分ですが、結構出来て居るはずです。
色々試しましたが、try{}catch{}ではエラーが起きる場面が複数であるようなときは、一度起きてしまうと処理が中断するようです。
例外を感知しても、x / yで実行時エラーになるのが不味い。どうすれば良いんでしょうね。
Javaではthrow new Exception("");が起きると m / nはされないようです。
実行画面が違いますが、計算自体がプラスだけならうえでも良いかも。でも一般的にはマイナスもあるので駄目ですね。どうしたらすっきりしますかね?
実践Scala入門ではmatchの例です。ここは泥臭い、手続型をやってみましたが、一行で書けるようです。
reverseNo2が例題です。recursiveを使っているようですが。(*_*;
reverseの引数はArray[Int]でしたが、Array[Any]でやってみました。
List(6,5,4,3,2,1)と結果がなってます。これはここを見ると、文字なのか?数字なのか?下のList(d,c,b,a)ですので、文字なんですかね。
前回はcase class Pointを使わないと面倒です。から今回は使えばこうなるです。
コップ本がなかなか進まないので、というか、全体が見えない、というか、難しい。(-_-;)幾分簡単かと思える、「実践Scala入門」も時々見ていきたいです。その中の例題です。
この程度であれば、何とか理解できたと思います。
追記)以前に何故か?()が出力されることがありました。今回もそうなったのですが、原因が分かりました。今はメソッドtoStringで文字列を返してきます。それをprintするので問題ないのですが、前はその部分をshowPoinメソッドでprintしてました。そのメソッドをprint(c.showPoint)のようにしてました。多分ですが、c.showPointがUnitですので、返す値が()ということでしょうね。一見不思議でしたが、何となく目から鱗(-_-;)です。
コップ本から
パターンガードはパターンの後ろに付けて、ifから始める。ifの後のガードは任意の論理式で良い。その式の中では、一般にパターンの中の変数が参照される。nとsとかのことでしょうね。この場合はリターンはIntになってますが、IntとStringなど混ぜてはいけないでしょうね。
パターン変数は、パターンの中で一度しか登場させることが出来ない。BinOpの例で論じられてます。
コップ本P280からオプション値は、2種類の形を持っている。Some(x)という形をとるときは、xが実際の値である。もう一つの形は、値がないことを表すNoneである。ということらしいです。(-_-;)実際、-1を返してくれるには、どうすれば良いんだろうか?
def generalSizeが値を返しても、何なのか?分かりません。こんなときはタプルで返すと簡単なようです。返された値を分けないと、使えないでしょうから、青線の上に分け方あります。こうすれば例えば、文字列で大きさは3とか分かるので、使い道はありそうです。
型付きパターンの場合は、分けられてしまえば、文字列とかMap,Listとして扱えるようなので、勧められてます。一方では勧められないスタイルもあるようです。でもListやMapでは中まではチェックされないようです。List(1,2,3)でもList("abc","def","ghi")でも区別が使い無いようです。但しArrayだけはArray(1,2,3)とArray("abc","def","ghi")が区別されるようです。
コップ本から、コンストラクターパターンの例題の説明
トップオブジェクトがBinOpかどうかチェックされるだけで無く、コンストラクタの第3パラメータがNumberで値が0かどうかまでチェックされる。
EとPiはマッチしません。
コップ本ではval pi = Math.Piとなってますが、プログラムで入力するとval pi = Math.PIとIが大文字になります。または上の上のようにval pi = Piとなるようです。
piが変数でEとマッチングしたようになるようです。デフォルトケースはunreachable code到達できないコードになってるようです。
コップ本の説明から
変数パターンは、ワイルドカードと同じように、任意のオブジェクトにマッチする。しかし、ワイルドカードとは異なり、Scalaはオブジェクトに変数を束縛する。その後は、変数と使ってオブジェクトを操作できる。となってます。(-_-;)
どうしても小文字のpiを使いたいのであれば、`pi`とするとmatchしなくなるようです。ワーニングも出ないようです。
コップ本から
Scalaは先頭が小文字になっている単純名はパターン変数、そうでないものは定数とみなす。バッククォートの使い方は2種類。パターンマッチで小文字に識別子を定数として扱う。(ここの例)キーワードの語を識別子として扱う。ことが出来るそうです。
somethingElseが有効なのはmatch{}の中だけのようです。整数であれば計算できるはずですね。
確かに計算は出来ます。下は前の実行例です。