mapAccumLeftについての補足

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

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

[scala]
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))
[/scala]

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

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

は、早い…。

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

[scala]
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))
[/scala]

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