セカイノカタチスマートフォン用の表示で見るセカイノカタチ世界のカタチを探求するブログ。関数型言語に興味があり、HaskellやScalaを勉強中。久しぶりに、#rpscalaにて発表をしました。最近TLなんかでfoldの話しが盛り上がっていたので、foldについて簡単にまとめたスライドです。fold沼についてあまり、深みのある話しは無いのですが、Markdownで書いたのでブログにも転載しておこうと、下記に貼り付けます。List(1,2,3).fold(0)(_+_)定義foldメソッドは、だいたいここで定義されている。A1既知のサブクラスは220個ほど。標準ライブラリのcollectionは、全部foldできる。こんな感じのjsで抽出。console.log(n.innerText))以下のクラスは、GenTraversableOnceを継承しておらず、独自にfoldを定義している。EitherOptionTryFuture(object)(Deprecated)※FutureのfoldはDeprecatedで、objectに定義されていて、TraversableOnce[Future[T]]を畳み込むだけなので無視TraversableOnce.foldもう一度、シグニチャ。A1なお、foldLeftのシグニチャ。foldLeft/foldRightの方が柔軟性が高く便利(であるが、並列化可能なため、foldの要求を満たす計算はfoldで実装しておいたほうが良い)Option.foldとにかく多用します(当社比)。u.userName}Option/Try/Eitherという、失敗系のコンテナから値をスムーズに取り出すのに使います。とある方面ではコンテナを失敗系・状態系などと分けたりします。なんと、Listも失敗系に分類されるので、今回登場するコンテナは全て失敗系です。isEmptyscaladocには下記のような注釈があります。isEmptyこれと同義だということです。カッコが省略されてますね。Option.map(f).getOrElse(isEmpty)となります。mapメソッドは、AからBへコンテナの値を変換するメソッドです。getOrElseは、OptionがNoneだった場合に返す値を定義しています。先程の例で言うと、これでも問題ないということです。Tryなんかを使いますが、最終的には別の型(Resultとか)で返すというパターンになります。失敗系の計算を連結するには、map/flatMapが定番ですが、最終的に値が取り出せません。値を取り出すための方法の1つがfoldという事になります。foldの場合、先にデフォルトの値を書き、getOrElseはmapの後に書くことになります。u.userName)の部分は、実際には数行になることが多いので、ソースの見通し上foldが好まれるのだと思います。Either.foldEitherのfoldは、結果がLeftだった時の処理、Rightだった時の処理と2つの関数を取ります。...}Try.foldTryのfoldは、結果がFailureだった時の処理、Successだった時の処理と2つの関数を取ります。U正直、match(ryまとめるとScalaのfoldは、TraversableOnce系とそれ以外に別れるTraversableOnce系のfoldは結合則を満たす必要があるが、並列化可能そのため計算結果を別の型に出来ない。foldLeft/foldRightの方が柔軟性が高いが用途に応じて選択すると良いそれ以外のfoldは、失敗時と成功時の値や処理を振り分けつつ最終的な値を取り出すのに便利getOrElseやmatchを使うかは好み(だと思う)おまけHaskellの場合、foldは、Foldableという型クラスになっている。bコンテナの中身がMonoidである必要があり、mappendで自動的に畳み込まれる。Scalaのfoldと同じくMonoidである必要がある(つまり結合則を満たす)。ブログ版追記gitter.imrpscalaの後、Gitterにて吉田さんから突っ込みをいただきました。A」となっているので、「型が変えられない!(不便!)」と書いたのですが、畳込みの型が同じであることによって、並列処理可能というメリットがあります。GenTraversableOnceのscaladocにも、下記のような注釈があります。nondeterministic.要素に対する実行順は規定されていないということです、つまりバラバラに計算してつなぎ合わせるような実装も想定されているということです。ちなみに、実際に評価順が並列になるような実装がないか標準ライブラリ内を探したのですが、現時点ではそのような実装は無いようでした。Scala職人の朝は早く、foldの沼は深い・・・。#haskellはい。第6回も無事開催することが出来ました。はてなブログProシステム開発の世界で15年の山の民による、世界のカタチを探求するブログ。(4)はてなブログをはじめよう!qtamakiさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。