{"id":56366,"date":"2016-05-17T10:00:56","date_gmt":"2016-05-17T07:00:56","guid":{"rendered":"https:\/\/www.javacodegeeks.com\/?p=56366"},"modified":"2016-05-16T16:34:30","modified_gmt":"2016-05-16T13:34:30","slug":"bowling-kata-clojure-f-scala","status":"publish","type":"post","link":"https:\/\/www.javacodegeeks.com\/2016\/05\/bowling-kata-clojure-f-scala.html","title":{"rendered":"Bowling Kata in Clojure, F# and Scala"},"content":{"rendered":"<p>In one of our evening apprenticeship meetings, a pair was doing the <a href=\"http:\/\/codingdojo.org\/cgi-bin\/index.pl?KataBowling\">Bowling Kata<\/a> in Java. After reviewing their code, I thought that it would be a good idea to do it myself.<\/p>\n<p>Every craftsman at Codurance is a polyglot developer and, although we have very similar values, we all have our own preferences when it comes to programming languages and coding styles. As you can imagine, we cannot always avoid cracking a joke or two about all the languages we don\u2019t like so much but other craftsmen in the company do. So, just for fun, quite a few of us decided to do the same kata using our language of choice. It was great to see the same problem solved with different languages. Although there are still a few craftsmen and apprentices working on solving the kata in different languages, here are 3 of my favourite solutions so far (in no particular order):<\/p>\n<h2>Clojure (by Mashooq)<\/h2>\n<pre class=\"brush:java\">(ns bowling.core-test\r\n  (:require [clojure.test :refer :all]\r\n            [bowling.core :refer :all]))\r\n\r\n(deftest bowling \r\n  (testing \"strikes for all rolls\"\r\n    (is (= 300 (score \"XXXXXXXXXXXX\"))))\r\n\r\n  (testing \"normal scores\"\r\n    (is (= 99 (score \"91919393929291219191\"))))\r\n\r\n  (testing \"normal scores or misses\"\r\n    (is (= 90 (score \"9-9-9-9-9-9-9-9-9-9-\")))\r\n    (is (= 93 (score \"919-9-9-9-9-929-9-9-\"))))\r\n\r\n  (testing \"mixture of stikes and normals\"\r\n    (is (= 98 (score \"9-X8-9-9-9-9-9-9-9-\")))\r\n    (is (= 104 (score \"9-X8-9-9-9-9-9-9-X23\")))\r\n    (is (= 28 (score \"--X81--------------\")))\r\n    (is (= 27 (score \"--X8-1-------------\"))))\r\n\r\n  (testing \"spares for all rolls\"\r\n    (is (= 150 (score \"5\/5\/5\/5\/5\/5\/5\/5\/5\/5\/5\"))))\r\n\r\n  (testing \"mixture of spares and normals\"\r\n    (is (= 82 (score \"9-8\/--9-9-9-9-9-9-9-\")))\r\n    (is (= 84 (score \"9-8\/--9-9-9-9-9-9-9\/1\")))\r\n    (is (= 12 (score \"--8\/1---------------\")))\r\n    (is (= 11 (score \"--8\/-1--------------\")))))<\/pre>\n<pre class=\"brush:java\">(ns bowling.core)\r\n\r\n(defn- spare?[s] (= \\\/ s))\r\n(defn- strike? [s] (= \\X s))\r\n(defn- spare-or-strike? [s] (or (spare? s) (strike? s)))\r\n(defn- miss? [s] (or (= nil s) (= \\- s)))\r\n\r\n(defn- score-for [s] \r\n  (cond \r\n     (spare-or-strike? s)  10\r\n     (miss? s)  0 \r\n     :else (read-string (str s))))\r\n\r\n(defn- score-roll [this-roll rem-rolls]\r\n  (cond \r\n    (strike? this-roll) (+ 10 (score-for (first rem-rolls)) (score-for (first (rest rem-rolls))))\r\n    (spare? this-roll) (+ 10 (score-for (first rem-rolls)))\r\n    (spare? (first rem-rolls)) 0\r\n    :else (score-for this-roll)))\r\n\r\n(defn- score-rolls [acc rolls]\r\n  (if (seq rolls)  \r\n    (let [running-score (+ acc (score-roll (first rolls) (rest rolls)))]\r\n      (score-rolls running-score (rest rolls)))\r\n    acc))\r\n\r\n(defn- expand-strikes [rolls]\r\n  (seq (reduce str  (map #(if  (strike? %) \"X-\"  (str %)) (seq rolls)))))\r\n\r\n(defn- deduct-extra-rolls [score rolls]\r\n  (- score  (score-rolls 0 (drop 20 (expand-strikes rolls)))))\r\n\r\n(defn score [rolls] \r\n  (deduct-extra-rolls (score-rolls 0 (seq rolls)) rolls))<\/pre>\n<p>See on <a href=\"https:\/\/github.com\/mashooq\/katas\/tree\/master\/clojure\/bowling\">Mash&#8217;s GitHub<\/a><\/p>\n<h2>F# (by Pedro)<\/h2>\n<pre class=\"brush:java\">namespace BowlingV2.FSharpKatas\r\n\r\n    module Bowling = \r\n        open System\r\n\r\n        type private Rolls = Strike | Spare | Roll\r\n        type private Pins = Pins of int\r\n        type private Roll = Rolls * Pins\r\n\r\n        let private maxRolls = 20\r\n        let private maxPins = 10\r\n        let private noPins = 0\r\n\r\n        let private pinCountForRoll roll =\r\n            let (Pins pins) = snd roll\r\n            pins\r\n\r\n        let private pinsFromRawRoll rawRoll =\r\n            Pins (Int32.Parse(rawRoll.ToString()))\r\n\r\n        let private sparePinsFromRawRoll rawRoll = \r\n            Pins (maxPins - Int32.Parse(rawRoll.ToString()))\r\n\r\n        let private parse roll index rolls =\r\n            let previousRoll = fun () -&gt; Seq.item (index - 1) rolls\r\n            match roll with\r\n            | '-' -&gt; Roll, Pins noPins\r\n            | '\/' -&gt; Spare, sparePinsFromRawRoll(previousRoll())\r\n            | 'X' -&gt; Strike, Pins maxPins\r\n            | r -&gt; Roll, pinsFromRawRoll r\r\n\r\n        let private scoreRoll index rolls =\r\n            let bonusRoll = fun(lookAhead) -&gt;  \r\n                if index + lookAhead &lt; Seq.length rolls \r\n                then pinCountForRoll (Seq.item (index + lookAhead) rolls) \r\n                else noPins       \r\n\r\n            let exceedsMaxRolls = fun() -&gt;\r\n                rolls \r\n                |&gt; Seq.take index\r\n                |&gt; Seq.map (fun r -&gt; match r with | (Strike, _) -&gt; 2 | _ -&gt; 1)\r\n                |&gt; Seq.sum &gt;= maxRolls\r\n\r\n            match Seq.item index rolls with\r\n                | (_, _) when exceedsMaxRolls() -&gt; noPins\r\n                | (Spare, Pins pins) -&gt; pins + bonusRoll 1\r\n                | (Strike, Pins pins) -&gt; pins + bonusRoll 1 + bonusRoll 2\r\n                | (Roll, Pins pins) -&gt; pins\r\n\r\n        let scoreGame rolls =\r\n            let parsedRolls = rolls |&gt; Seq.mapi (fun index roll -&gt; \r\n                                                    parse roll index rolls)\r\n\r\n            parsedRolls\r\n            |&gt; Seq.mapi (fun index _ -&gt; scoreRoll index parsedRolls)\r\n            |&gt; Seq.sum\r\n\r\n    module BowlingTests =\r\n        open NUnit.Framework\r\n        open Swensen.Unquote\r\n        open Bowling\r\n\r\n        [&lt;Test&gt;]\r\n        let ``calculate scores with no strikes or spares``() =\r\n            test &lt;@ scoreGame \"--\" = 0 @&gt; \r\n            test &lt;@ scoreGame \"1\" = 1 @&gt;\r\n            test &lt;@ scoreGame \"13\" = 4 @&gt;\r\n            test &lt;@ scoreGame \"13521\" = 12 @&gt;\r\n\r\n        [&lt;Test&gt;]\r\n        let ``calculate scores containing a miss``() =\r\n            test &lt;@ scoreGame \"1-5-\" = 6 @&gt;\r\n            test &lt;@ scoreGame \"9-9-9-9-9-9-9-9-9-9-\" = 90 @&gt;\r\n\r\n        [&lt;Test&gt;]\r\n        let ``calculate scores containing spares``() =\r\n            test &lt;@ scoreGame \"1\/\" = 10 @&gt;\r\n            test &lt;@ scoreGame \"1\/--\" = 10 @&gt;\r\n            test &lt;@ scoreGame \"1\/-5\" = 15 @&gt;\r\n            test &lt;@ scoreGame \"1\/35-\" = 21 @&gt;\r\n            test &lt;@ scoreGame \"1\/3\/23\" = 30 @&gt;\r\n            test &lt;@ scoreGame \"5\/5\/5\/5\/5\/5\/5\/5\/5\/5\/5\" = 150 @&gt;\r\n\r\n        [&lt;Test&gt;]\r\n        let ``calculate scores containing strikes``() =\r\n            test &lt;@ scoreGame \"X\" = 10 @&gt;\r\n            test &lt;@ scoreGame \"X--\" = 10 @&gt;\r\n            test &lt;@ scoreGame \"X--51\" = 16 @&gt;\r\n            test &lt;@ scoreGame \"X51\" = 22 @&gt;\r\n            test &lt;@ scoreGame \"XXXXXXXXXXXX\" = 300 @&gt;\r\n            test &lt;@ scoreGame \"XXXXXXXXXX12\" = 274 @&gt;\r\n            test &lt;@ scoreGame \"1\/35XXX45\" = 103 @&gt;\r\n            test &lt;@ scoreGame \"1\/35XXX458\/X35\" = 149 @&gt;\r\n            test &lt;@ scoreGame \"1\/35XXX458\/X3\/\" = 153 @&gt;\r\n            test &lt;@ scoreGame \"1\/35XXX458\/X3\/23\" = 160 @&gt;\r\n            test &lt;@ scoreGame \"1\/35XXX458\/X3\/X\" = 173 @&gt;\r\n            test &lt;@ scoreGame \"1\/35XXX458\/X3\/XX6\" = 189 @&gt;<\/pre>\n<p>See on <a href=\"https:\/\/github.com\/pedromsantos\/FSharpKatas\/blob\/master\/BowlingV2.fs\">Pedro&#8217;s GitHub<\/a><div style=\"display:inline-block; margin: 15px 0;\"> <div id=\"adngin-JavaCodeGeeks_incontent_video-0\" style=\"display:inline-block;\"><\/div> <\/div><\/p>\n<h2>Scala (by Sandro)<\/h2>\n<pre class=\"brush:java\">package com.codurance.bowlingkata.full_scoring\r\n\r\nimport com.codurance.UnitSpec\r\nimport com.codurance.bowlingkata.full_scoring.BowlingFullScoreCalculator.scoreFor\r\n\r\nclass BowlingFullScoreCalculatorShould extends UnitSpec {\r\n\r\n    \"calculate scores with no strikes or spares\" in {\r\n        scoreFor(\"11111111112222222222\") should be (30)\r\n    }\r\n\r\n    \"calculate scores containing a miss\" in {\r\n        scoreFor(\"--------------------\") should be (0)\r\n        scoreFor(\"1-1----------------1\") should be (3)\r\n        scoreFor(\"9-9-9-9-9-9-9-9-9-9-\") should be (90)\r\n    }\r\n\r\n    \"calculate scores containing spares\" in {\r\n        scoreFor(\"5\/11------------3\/11\") should be (26)\r\n        scoreFor(\"5\/5\/5\/5\/5\/5\/5\/5\/5\/5\/5\") should be (150)\r\n    }\r\n\r\n    \"calculate scores containing strikes\" in {\r\n        scoreFor(\"XXXXXXXXXXXX\") should be(300)\r\n        scoreFor(\"XXXXXXXXXX12\") should be(274)\r\n        scoreFor(\"1\/35XXX458\/X3\/23\") should be(160)\r\n        scoreFor(\"1\/35XXX458\/X3\/XX6\") should be(189)\r\n    }\r\n}<\/pre>\n<pre class=\"brush:java\">package com.codurance.bowlingkata.full_scoring\r\n\r\nobject BowlingFullScoreCalculator {\r\n\r\n    def scoreFor(rolls: String): Int = totalScore(rolls.split(\"\").toList)\r\n\r\n    private def totalScore(rolls: List[String], index: Int = 0, score: Int = 0): Int = {\r\n        lazy val MISS  = \"-\"\r\n        lazy val SPARE = (\"\/\", () =&gt; 10 - rollScoreAt(index - 1) + if_(index &lt; 19, rollScoreAt(index + 1)))\r\n        lazy val STRIKE = (\"X\", () =&gt; 10 + if_(index + numberOfPreviousStrikes() &lt; 18,\r\n                                               rollScoreAt(index + 1) + rollScoreAt(index + 2)))\r\n\r\n        def numberOfPreviousStrikes() = rolls.mkString.take(index).count(_ == 'X')\r\n\r\n        def rollScoreAt(index: Int): Int =\r\n            rolls(index) match {\r\n                case STRIKE._1 =&gt; 10\r\n                case SPARE._1  =&gt; 10 - rolls(index - 1).toInt\r\n                case MISS      =&gt; 0\r\n                case pins      =&gt; pins.toInt\r\n            }\r\n\r\n        rolls.drop(index) match {\r\n            case STRIKE._1 :: _ =&gt; totalScore(rolls, index + 1, score + STRIKE._2())\r\n            case SPARE._1 :: _  =&gt; totalScore(rolls, index + 1, score + SPARE._2())\r\n            case MISS :: _      =&gt; totalScore(rolls, index + 1, score)\r\n            case n :: _         =&gt; totalScore(rolls, index + 1, score + n.toInt)\r\n            case List()         =&gt; score\r\n        }\r\n    }\r\n\r\n    private def if_(condition: Boolean, ifTrue: =&gt; Int): Int = if (condition) ifTrue else 0\r\n}<\/pre>\n<p>See on <a href=\"https:\/\/github.com\/sandromancuso\/bowling_kata_scala\">Sandro&#8217;s GitHub<\/a><\/p>\n<h2>Fun, passion, and respect<\/h2>\n<p>Having fun at work, be surrounded by passionate and talented craftsmen, the respect we have for each other, and the willingness to learn and share, are some of the things I love the most about the Codurance\u2019s culture. What started as apprentices practicing with a kata transformed into a great way to learn and share knowledge among craftsmen and apprentices. Some of our craftsmen and apprentices are also working on their solutions in Kotlin, Haskell, Java, and C#.<\/p>\n<p>As among ourselves we will probably never agree which one we prefer, we will let you choose which one you like the most. :)<\/p>\n<p>Thanks <a href=\"https:\/\/twitter.com\/mashooq\">Mash<\/a> and <a href=\"https:\/\/twitter.com\/pedromsantos\">Pedro<\/a> for the Clojure and F# implementations.<\/p>\n<div class=\"attribution\">\n<table>\n<tbody>\n<tr>\n<td><span class=\"reference\">Reference: <\/span><\/td>\n<td><a href=\"http:\/\/codurance.com\/2016\/05\/16\/bowling-kata-in-clojure-fsharp-scala\/\">Bowling Kata in Clojure, F# and Scala<\/a> from our <a href=\"http:\/\/www.javacodegeeks.com\/join-us\/jcg\/\">JCG partner<\/a> Sandro Mancuso at the <a href=\"http:\/\/codurance.com\/\">Crafted Software<\/a> blog.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>In one of our evening apprenticeship meetings, a pair was doing the Bowling Kata in Java. After reviewing their code, I thought that it would be a good idea to do it myself. Every craftsman at Codurance is a polyglot developer and, although we have very similar values, we all have our own preferences when &hellip;<\/p>\n","protected":false},"author":180,"featured_media":93,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[22],"tags":[],"class_list":["post-56366","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-clojure"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Bowling Kata in Clojure, F# and Scala - Java Code Geeks<\/title>\n<meta name=\"description\" content=\"In one of our evening apprenticeship meetings, a pair was doing the Bowling Kata in Java. After reviewing their code, I thought that it would be a good\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.javacodegeeks.com\/2016\/05\/bowling-kata-clojure-f-scala.html\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Bowling Kata in Clojure, F# and Scala - Java Code Geeks\" \/>\n<meta property=\"og:description\" content=\"In one of our evening apprenticeship meetings, a pair was doing the Bowling Kata in Java. After reviewing their code, I thought that it would be a good\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.javacodegeeks.com\/2016\/05\/bowling-kata-clojure-f-scala.html\" \/>\n<meta property=\"og:site_name\" content=\"Java Code Geeks\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/javacodegeeks\" \/>\n<meta property=\"article:published_time\" content=\"2016-05-17T07:00:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/clojure-logo.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"150\" \/>\n\t<meta property=\"og:image:height\" content=\"150\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Sandro Mancuso\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@sandromancuso\" \/>\n<meta name=\"twitter:site\" content=\"@javacodegeeks\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sandro Mancuso\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/05\\\/bowling-kata-clojure-f-scala.html#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/05\\\/bowling-kata-clojure-f-scala.html\"},\"author\":{\"name\":\"Sandro Mancuso\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/0f9601c11f2e3c1093d0faf756935751\"},\"headline\":\"Bowling Kata in Clojure, F# and Scala\",\"datePublished\":\"2016-05-17T07:00:56+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/05\\\/bowling-kata-clojure-f-scala.html\"},\"wordCount\":320,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/05\\\/bowling-kata-clojure-f-scala.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/clojure-logo.jpg\",\"articleSection\":[\"Clojure\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/05\\\/bowling-kata-clojure-f-scala.html#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/05\\\/bowling-kata-clojure-f-scala.html\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/05\\\/bowling-kata-clojure-f-scala.html\",\"name\":\"Bowling Kata in Clojure, F# and Scala - Java Code Geeks\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/05\\\/bowling-kata-clojure-f-scala.html#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/05\\\/bowling-kata-clojure-f-scala.html#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/clojure-logo.jpg\",\"datePublished\":\"2016-05-17T07:00:56+00:00\",\"description\":\"In one of our evening apprenticeship meetings, a pair was doing the Bowling Kata in Java. After reviewing their code, I thought that it would be a good\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/05\\\/bowling-kata-clojure-f-scala.html#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/05\\\/bowling-kata-clojure-f-scala.html\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/05\\\/bowling-kata-clojure-f-scala.html#primaryimage\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/clojure-logo.jpg\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2012\\\/10\\\/clojure-logo.jpg\",\"width\":150,\"height\":150},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/2016\\\/05\\\/bowling-kata-clojure-f-scala.html#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JVM Languages\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/jvm-languages\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Clojure\",\"item\":\"https:\\\/\\\/www.javacodegeeks.com\\\/category\\\/jvm-languages\\\/clojure\"},{\"@type\":\"ListItem\",\"position\":4,\"name\":\"Bowling Kata in Clojure, F# and Scala\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#website\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"name\":\"Java Code Geeks\",\"description\":\"Java Developers Resource Center\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\"},\"alternateName\":\"JCG\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.javacodegeeks.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#organization\",\"name\":\"Exelixis Media P.C.\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"contentUrl\":\"https:\\\/\\\/www.javacodegeeks.com\\\/wp-content\\\/uploads\\\/2022\\\/06\\\/exelixis-logo.png\",\"width\":864,\"height\":246,\"caption\":\"Exelixis Media P.C.\"},\"image\":{\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/javacodegeeks\",\"https:\\\/\\\/x.com\\\/javacodegeeks\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.javacodegeeks.com\\\/#\\\/schema\\\/person\\\/0f9601c11f2e3c1093d0faf756935751\",\"name\":\"Sandro Mancuso\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ea088d246115dc368b741f5b6c5a55846bfd30dcd60f9b06ab35844f64ff706c?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ea088d246115dc368b741f5b6c5a55846bfd30dcd60f9b06ab35844f64ff706c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/ea088d246115dc368b741f5b6c5a55846bfd30dcd60f9b06ab35844f64ff706c?s=96&d=mm&r=g\",\"caption\":\"Sandro Mancuso\"},\"description\":\"Software craftsman, founder of the London Software Craftsmanship Community (LSCC) and author of Software Craftsmanship: Professionalism, Pragmatism, Pride.\",\"sameAs\":[\"http:\\\/\\\/codurance.com\\\/\",\"http:\\\/\\\/www.linkedin.com\\\/in\\\/sandromancuso\",\"https:\\\/\\\/x.com\\\/sandromancuso\"],\"url\":\"https:\\\/\\\/www.javacodegeeks.com\\\/author\\\/sandro-mancuso\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Bowling Kata in Clojure, F# and Scala - Java Code Geeks","description":"In one of our evening apprenticeship meetings, a pair was doing the Bowling Kata in Java. After reviewing their code, I thought that it would be a good","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.javacodegeeks.com\/2016\/05\/bowling-kata-clojure-f-scala.html","og_locale":"en_US","og_type":"article","og_title":"Bowling Kata in Clojure, F# and Scala - Java Code Geeks","og_description":"In one of our evening apprenticeship meetings, a pair was doing the Bowling Kata in Java. After reviewing their code, I thought that it would be a good","og_url":"https:\/\/www.javacodegeeks.com\/2016\/05\/bowling-kata-clojure-f-scala.html","og_site_name":"Java Code Geeks","article_publisher":"https:\/\/www.facebook.com\/javacodegeeks","article_published_time":"2016-05-17T07:00:56+00:00","og_image":[{"width":150,"height":150,"url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/clojure-logo.jpg","type":"image\/jpeg"}],"author":"Sandro Mancuso","twitter_card":"summary_large_image","twitter_creator":"@sandromancuso","twitter_site":"@javacodegeeks","twitter_misc":{"Written by":"Sandro Mancuso","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.javacodegeeks.com\/2016\/05\/bowling-kata-clojure-f-scala.html#article","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/05\/bowling-kata-clojure-f-scala.html"},"author":{"name":"Sandro Mancuso","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/0f9601c11f2e3c1093d0faf756935751"},"headline":"Bowling Kata in Clojure, F# and Scala","datePublished":"2016-05-17T07:00:56+00:00","mainEntityOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/05\/bowling-kata-clojure-f-scala.html"},"wordCount":320,"commentCount":1,"publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/05\/bowling-kata-clojure-f-scala.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/clojure-logo.jpg","articleSection":["Clojure"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.javacodegeeks.com\/2016\/05\/bowling-kata-clojure-f-scala.html#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.javacodegeeks.com\/2016\/05\/bowling-kata-clojure-f-scala.html","url":"https:\/\/www.javacodegeeks.com\/2016\/05\/bowling-kata-clojure-f-scala.html","name":"Bowling Kata in Clojure, F# and Scala - Java Code Geeks","isPartOf":{"@id":"https:\/\/www.javacodegeeks.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/05\/bowling-kata-clojure-f-scala.html#primaryimage"},"image":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/05\/bowling-kata-clojure-f-scala.html#primaryimage"},"thumbnailUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/clojure-logo.jpg","datePublished":"2016-05-17T07:00:56+00:00","description":"In one of our evening apprenticeship meetings, a pair was doing the Bowling Kata in Java. After reviewing their code, I thought that it would be a good","breadcrumb":{"@id":"https:\/\/www.javacodegeeks.com\/2016\/05\/bowling-kata-clojure-f-scala.html#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.javacodegeeks.com\/2016\/05\/bowling-kata-clojure-f-scala.html"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/2016\/05\/bowling-kata-clojure-f-scala.html#primaryimage","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/clojure-logo.jpg","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2012\/10\/clojure-logo.jpg","width":150,"height":150},{"@type":"BreadcrumbList","@id":"https:\/\/www.javacodegeeks.com\/2016\/05\/bowling-kata-clojure-f-scala.html#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.javacodegeeks.com\/"},{"@type":"ListItem","position":2,"name":"JVM Languages","item":"https:\/\/www.javacodegeeks.com\/category\/jvm-languages"},{"@type":"ListItem","position":3,"name":"Clojure","item":"https:\/\/www.javacodegeeks.com\/category\/jvm-languages\/clojure"},{"@type":"ListItem","position":4,"name":"Bowling Kata in Clojure, F# and Scala"}]},{"@type":"WebSite","@id":"https:\/\/www.javacodegeeks.com\/#website","url":"https:\/\/www.javacodegeeks.com\/","name":"Java Code Geeks","description":"Java Developers Resource Center","publisher":{"@id":"https:\/\/www.javacodegeeks.com\/#organization"},"alternateName":"JCG","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.javacodegeeks.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.javacodegeeks.com\/#organization","name":"Exelixis Media P.C.","url":"https:\/\/www.javacodegeeks.com\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/","url":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","contentUrl":"https:\/\/www.javacodegeeks.com\/wp-content\/uploads\/2022\/06\/exelixis-logo.png","width":864,"height":246,"caption":"Exelixis Media P.C."},"image":{"@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/javacodegeeks","https:\/\/x.com\/javacodegeeks"]},{"@type":"Person","@id":"https:\/\/www.javacodegeeks.com\/#\/schema\/person\/0f9601c11f2e3c1093d0faf756935751","name":"Sandro Mancuso","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/ea088d246115dc368b741f5b6c5a55846bfd30dcd60f9b06ab35844f64ff706c?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/ea088d246115dc368b741f5b6c5a55846bfd30dcd60f9b06ab35844f64ff706c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ea088d246115dc368b741f5b6c5a55846bfd30dcd60f9b06ab35844f64ff706c?s=96&d=mm&r=g","caption":"Sandro Mancuso"},"description":"Software craftsman, founder of the London Software Craftsmanship Community (LSCC) and author of Software Craftsmanship: Professionalism, Pragmatism, Pride.","sameAs":["http:\/\/codurance.com\/","http:\/\/www.linkedin.com\/in\/sandromancuso","https:\/\/x.com\/sandromancuso"],"url":"https:\/\/www.javacodegeeks.com\/author\/sandro-mancuso"}]}},"_links":{"self":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/56366","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/users\/180"}],"replies":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/comments?post=56366"}],"version-history":[{"count":0,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/posts\/56366\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media\/93"}],"wp:attachment":[{"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/media?parent=56366"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/categories?post=56366"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.javacodegeeks.com\/wp-json\/wp\/v2\/tags?post=56366"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}