{"id":2596,"date":"2015-09-15T01:19:23","date_gmt":"2015-09-15T01:19:23","guid":{"rendered":"http:\/\/www.garysieling.com\/blog\/?p=2596"},"modified":"2015-09-15T01:19:23","modified_gmt":"2015-09-15T01:19:23","slug":"scala-foldleft-example","status":"publish","type":"post","link":"https:\/\/www.garysieling.com\/blog\/scala-foldleft-example\/","title":{"rendered":"Scala foldLeft example"},"content":{"rendered":"<p>If you haven&#8217;t seen curried functions before, the syntax for foldLeft looks pretty weird:<\/p>\n<pre lang=\"Scala\">\nList(1, 2, 3)\n  .foldLeft(0)((x, y) => { x + y })\n\nres108: Int = 6\n<\/pre>\n<p>The first foldLeft argument is the initial value (0), and the second is a function to combine two values (0 + 1, then 1 + 2, then 3 + 3).<\/p>\n<pre lang=\"scala\">\nscala> List(1, 2, 3).foldLeft(0)_\nres110: ((Int, Int) => Int) => Int = <function1>\n<\/pre>\n<p>One of the neat things about this style of programming is that you can have the code that sets the initial value be far afield from the code that provides the summing operation (this is useful if you&#8217;re defining events that touch a model &#8211; the model could expose defaults this way, while delegating event handling to other classes)<\/p>\n<p>The syntax for this is a bit weird, and the type that results is nearly incomprehensible:<\/p>\n<pre lang=\"Scala\">\nval y = List(1, 2, 3).foldLeft(0)_\ny: ((Int, Int) => Int) => Int = <function1>\n<\/pre>\n<p>But, it works just liked you&#8217;d expect:<\/p>\n<pre lang=\"scala\"\nscala> y( (a, b) => a + b )\nres111: Int = 6\n<\/pre>\n<p>How is this different from &#8220;reduce&#8221;? See here:<\/p>\n<pre lang=\"scala\">\nList(1, 2, 3).reduce( (x, y) => x + y )\n<\/pre>\n<p>Reduce is simpler, and is called without the default value (if you weren&#8217;t previously familiar with foldLeft, you might actually expect it&#8217;s signature to match the example above!)<\/p>\n","protected":false},"excerpt":{"rendered":"<p>If you haven&#8217;t seen curried functions before, the syntax for foldLeft looks pretty weird: List(1, 2, 3) .foldLeft(0)((x, y) => { x + y }) res108: Int = 6 The first foldLeft argument is the initial value (0), and the second is a function to combine two values (0 + 1, then 1 + 2, &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/www.garysieling.com\/blog\/scala-foldleft-example\/\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;Scala foldLeft example&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"footnotes":""},"categories":[4],"tags":[480,482,488],"aioseo_notices":[],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/2596"}],"collection":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/comments?post=2596"}],"version-history":[{"count":0,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/posts\/2596\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/media?parent=2596"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/categories?post=2596"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.garysieling.com\/blog\/wp-json\/wp\/v2\/tags?post=2596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}