読者です 読者をやめる 読者になる 読者になる

Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

Scalaの総数を取得する再帰呼び出し

関数型言語では宣言的な関数を用いることが推奨されるのでループで++みたいな手続きをそのまま書くのはノットソークールだと。慣れたら再帰で書くほうが直感的になる感、チョットわかった。

 def sumList(list:List[Int]): Int = {
    list match {
        case Nil => 0
        case x::list => x + sumList(list)
    }        
}

これが全然理解できなかったんですよ。特にここが。

    case x::list => x + sumList(list)

この再帰を抜けるためにはsumlistで指定されたリストがNilになるしかない。つまり、再帰で呼び出される度にtailし続けなくてはいけない。それがなんで「x::list」で出来るのか、全然理解できなかった。

聞くは一時の恥、聞かぬは一生の恥。stackoverflowを使わせて頂きました。

ja.stackoverflow.com

頂いた回答のコードを乗せます。おかげでバシッと理解できた。

def sumList(list:List[Int]): Int = {
    list match {
        case Nil => 0
        case head::tail => {
            head + sumList(tail)
        }
    }        
}

うおおおおおおおおおおお! Consクラスにlistをパターンマッチして、展開しているってことか!!!!

Consクラスは (head:A,tail:List[A])という形で構成されているクラスで、headとtailに分割することが出来る。headとtailに分けてtailを再帰呼び出ししているのだから、再帰呼び出しする毎にtailされ続け、最後は空っぽになるわけだ〜

ご回答いただいた方に感謝します。やっと理解出来ました。