mapAccumLeftについての補足

先日、こんな記事を書きました。

Scalaz始めました & foldとfoldLeftの違い

 val initialAmount = 50000
 val accountHistory = 4000 :: -3200 :: 3000 :: -4500 :: -110 :: -847 :: Nil

 val result = accountHistory.mapAccumLeft(initialAmount, (p: Int, c) => (p + c, p + c))
 print(result)
 // (48343,List(54000, 50800, 53800, 49300, 49190, 48343))

で、このmapAccumLeftの第二引数が型推論してくれないの何でだろ、同一パラメータリスト内だとダメなの?たぶんダメなんだよね。と書いたところ、@xuweiさんがscalazコードを即座に直して(pull req)くれました。

currying IList#{mapAccumRight, mapAccumLeft} for type inference #955

は、早い…。

私は型推論の仕組みは良くわかってないのですが、「カリー化すると型推論が効く」ということでした。また、カリー化したことによって副次的に次のように書けるようにもなります。

 val initialAmount = 50000
 val accountHistory = 4000 :: -3200 :: 3000 :: -4500 :: -110 :: -847 :: Nil

 val result = accountHistory.mapAccumLeft(initialAmount){
  (p, c) => (p + c, p + c)
 }
 print(result)
 // (48343,List(54000, 50800, 53800, 49300, 49190, 48343))

今回は一行だけなんで大差ないですが、やっぱりこういう風に書ける方が安心しますね。よかったよかった。こんなサイトまでわざわざ見てくださってありがとうございました。