この質問は炎の餌としてではありません!明らかかもしれませんが、私は最近Scalazを見ています。ライブラリが提供する機能の一部が必要な理由を理解しようとしています。ここに何かがあります:
import scalaz._
import Scalaz._
type NEL[A] = NonEmptyList[A]
val NEL = NonEmptyList
関数にprintlnステートメントをいくつか入れて、何が起こっているかを確認しました(ただし、そのような副作用を回避しようとした場合はどうすればよいでしょうか?)。私の機能は次のとおりです。
val f: NEL[Int] => String = (l: NEL[Int]) => {println("f: " + l); l.toString |+| "X" }
val g: NEL[String] => BigInt = (l: NEL[String]) => {println("g: " + l); BigInt(l.map(_.length).sum) }
それから私はそれらをcokleisliを介して結合し、NEL[Int]
val k = cokleisli(f) =>= cokleisli(g)
println("RES: " + k( NEL(1, 2, 3) ))
これは何を印刷しますか?
f: NonEmptyList(1, 2, 3)
f: NonEmptyList(2, 3)
f: NonEmptyList(3)
g: NonEmptyList(NonEmptyList(1, 2, 3)X, NonEmptyList(2, 3)X, NonEmptyList(3)X)
RES: 57
RES値は、最終的なNELの(文字列)要素の文字数です。私には2つのことが起こります。
- 関係するメソッドシグネチャから、この方法でNELが削減されることをどのようにして知ることができましたか?(私は結果をまったく期待していませんでした)
- これのポイントは何ですか?適度にシンプルでわかりやすいユースケースを私のために蒸留することはできますか?
この質問は、レトロニムのような素敵な人がこの強力なライブラリが実際にどのように機能するかを説明するための薄いベールのある嘆願です。