tag:blogger.com,1999:blog-54973599908223548322023-06-20T21:24:38.608-07:00mashebaliYairhttp://www.blogger.com/profile/03938694674587025243noreply@blogger.comBlogger4125tag:blogger.com,1999:blog-5497359990822354832.post-22873116148593442702011-02-25T14:51:00.000-08:002011-02-25T15:33:29.968-08:00Binary trees with type-enforced balanceA Red-black tree is a binary tree which has some properties which assure that it is balanced. <div><br /></div><div>The properties of the RB-Tree can be described using Haskell's type system, thus creating trees that must be balanced.</div><div><br /></div><div>The compiler will catch any bug in the code handling them which causes the tree to not be balanced - it will not type-check.</div><div><br /></div><div>The properties of Red-Black trees:</div><div><ul><li>Each node in the tree has a "color", either Red or Black.</li><li>All different paths from the root of the tree all the way down have the same number of Black nodes.</li><li>No path in the tree has two consecutive Red nodes.</li></ul><div>This assures that the ratio between the maximum and minimum depth will be no more than two. The minimum depth will be achieved by a path of Black nodes with no Red nodes between them, while the maximum depth would have as many Red nodes possible crammed between the Black nodes - at most one Red node between each two Black ones.</div></div><div><br /></div><div>In code:</div><div><br /></div><div><pre style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; "><div class="line" id="LC12" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; "><span class="cm" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(153, 153, 136); font-style: italic; ">{-# LANGUAGE EmptyDataDecls, ExistentialQuantification, GADTs #-}</span></div><div><span class="cm" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><pre style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; "><div class="line" id="LC23" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; color: rgb(0, 0, 0); font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; white-space: normal; "><span class="kr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; font-weight: bold; ">data</span> <span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">Zero</span></div><div class="line" id="LC24" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; color: rgb(0, 0, 0); font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; white-space: normal; "><span class="kr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; font-weight: bold; ">data</span> <span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">Succ</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">n</span></div><div><span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; "><pre style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; "><div class="line" id="LC26" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; white-space: normal; "><span class="c1" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; "><br /><span class="Apple-style-span"><i>-- We use trees whose root is Black. Simply for implementation convinience.</i></span></span></div><div class="line" id="LC27" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; color: rgb(0, 0, 0); font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; white-space: normal; "><span class="kr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; font-weight: bold; ">data</span> <span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">Tree</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">a</span> <span class="ow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; font-weight: bold; ">=</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">forall</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">n</span><span class="o" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; font-weight: bold; ">.</span> <span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">Tree</span> <span class="p" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">(</span><span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">BlackNode</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">n</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">a</span><span class="p" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">)</span></div><div class="line" id="LC28" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; color: rgb(0, 0, 0); font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; white-space: normal; "><span class="c1" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(153, 153, 136); font-style: italic; ">-- Node types are tagged by their subtree's Black-degree (number of Black nodes per path).</span></div><div class="line" id="LC29" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; color: rgb(0, 0, 0); font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; white-space: normal; "><span class="kr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; font-weight: bold; ">data</span> <span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">BlackNode</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">n</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">a</span> <span class="kr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; font-weight: bold; ">where</span></div><div class="line" id="LC30" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; white-space: normal; "> <span class="c1" style="color: white">__</span><span class="c1" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(153, 153, 136); font-style: italic; ">-- A degree 0 Black node must be an empty tree.</span></div><div class="line" id="LC31" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; white-space: normal; "><span class="kt" style="color: white">__</span><span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">Nil</span> <span class="ow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; font-weight: bold; color: rgb(0, 0, 0); ">::</span> <span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">BlackNode</span> <span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">Zero</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(0, 0, 0); ">a</span></div><div class="line" id="LC32" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; white-space: normal; "><span class="kt" style="color: white">__</span><span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">BlackNode</span> <span class="ow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; font-weight: bold; color: rgb(0, 0, 0); ">::</span> <span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">RBNode</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(0, 0, 0); ">n</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(0, 0, 0); ">a</span> <span class="ow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; font-weight: bold; color: rgb(0, 0, 0); ">-></span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(0, 0, 0); ">a</span> <span class="ow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; font-weight: bold; color: rgb(0, 0, 0); ">-></span> <span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">RBNode</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(0, 0, 0); ">n</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(0, 0, 0); ">a</span> <span class="ow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; font-weight: bold; color: rgb(0, 0, 0); ">-></span> <span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">BlackNode</span> <span class="p" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(0, 0, 0); ">(</span><span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">Succ</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(0, 0, 0); ">n</span><span class="p" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(0, 0, 0); ">)</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(0, 0, 0); ">a</span></div><div class="line" id="LC33" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; color: rgb(0, 0, 0); font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; white-space: normal; "><span class="kr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; font-weight: bold; ">data</span> <span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">RBNode</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">n</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">a</span></div><div class="line" id="LC34" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; white-space: normal; "> <span class="ow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; "><span style="color: white" >__</span><b>=</b></span> <span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">ItsRed</span> <span class="p" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(0, 0, 0); ">(</span><span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">RedNode</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(0, 0, 0); ">n</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(0, 0, 0); ">a</span><span class="p" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(0, 0, 0); ">)</span></div><div class="line" id="LC35" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; white-space: normal; "> <span class="o" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; font-weight: bold; "><span style="color: white" >__</span>|</span> <span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">ItsBlack</span> <span class="p" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(0, 0, 0); ">(</span><span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">BlackNode</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(0, 0, 0); ">n</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(0, 0, 0); ">a</span><span class="p" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(0, 0, 0); ">)</span></div><div class="line" id="LC36" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; color: rgb(0, 0, 0); font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; white-space: normal; "><span class="c1" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(153, 153, 136); font-style: italic; ">-- A Red node's children must be Black.</span></div><div class="line" id="LC37" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; color: rgb(0, 0, 0); font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; white-space: normal; "><span class="kr" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; font-weight: bold; ">data</span> <span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">RedNode</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">n</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">a</span> <span class="ow" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; font-weight: bold; ">=</span> <span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">RedNode</span> <span class="p" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">(</span><span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">BlackNode</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">n</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">a</span><span class="p" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">)</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">a</span> <span class="p" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">(</span><span class="kt" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; color: rgb(68, 85, 136); font-weight: bold; ">BlackNode</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">n</span> <span class="n" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">a</span><span class="p" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; ">)</span></div><div class="line" id="LC37" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 1em; line-height: 1.4em; color: rgb(0, 0, 0); font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; white-space: normal; "><span class="p" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; "><br /></span></div><div style="color: rgb(0, 0, 0); font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; line-height: 1.4em; white-space: normal; "><span class="Apple-style-span" style="font-family: Georgia, serif; font-size: 16px; line-height: normal; ">The types for the tree nodes are all indexed by the number of Black nodes per path / "RB-Depth".</span></div><div style="color: rgb(0, 0, 0); font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; line-height: 1.4em; white-space: normal; "><span class="p" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; "><span class="Apple-style-span" style="font-family: Georgia, serif; font-size: 16px; line-height: normal; white-space: normal; ">The outward facing type, "Tree", wraps a node type using an Existential for the depth, so the depth could be any value and the user of the type would not need to care.<br /></span></span></div><div style="color: rgb(0, 0, 0); font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; line-height: 1.4em; white-space: normal; "><span class="p" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; "><span class="Apple-style-span" style="font-family: Georgia, serif; font-size: 16px; line-height: normal; white-space: normal; "><br /></span></span></div><div style="color: rgb(0, 0, 0); font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; line-height: 1.4em; white-space: normal; "><span class="p" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; "><span class="Apple-style-span" style="font-family: Georgia, serif; font-size: 16px; line-height: normal; white-space: normal; ">While the type captures the structural rules of the tree, it does not capture the conditions required by binary search trees. I suppose that might be possible in fancier languages such as Agda, and perhaps I'll give it a try :)</span></span></div><div style="color: rgb(0, 0, 0); font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; font-size: 13px; line-height: 1.4em; white-space: normal; "><span class="p" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; "><span class="Apple-style-span" style="font-family: Georgia, serif; font-size: 16px; line-height: normal; white-space: normal; "><br /></span></span></div><div style="color: rgb(0, 0, 0); font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; line-height: 1.4em; white-space: normal; "><span class="p" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; font-size: 13px; "><span class="Apple-style-span" style="font-family: Georgia, serif; font-size: 16px; line-height: normal; white-space: normal; ">Complete working code for the tree, including the insert function, at </span></span><span class="Apple-style-span" style="font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; line-height: normal; "><a href="http://github.com/yairchu/red-black-tree/blob/master/RedBlackTree.hs"><span class="Apple-style-span">github.com/yairchu/red-black-tree/blob/master/RedBlackTree.hs</span></a></span></div><div style="color: rgb(0, 0, 0); font-style: normal; font-family: 'Bitstream Vera Sans Mono', Courier, monospace; line-height: 1.4em; "><span class="p" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; line-height: 1.4em; "><span class="Apple-style-span" style="font-family: Georgia, serif; line-height: normal; "><span class="Apple-style-span" style="font-family: Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; "><pre style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; font: normal normal normal 12px/normal Monaco, 'Courier New', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; "><div style="white-space: pre; "><span class="Apple-style-span"><br /></span></div></pre></span></span></span></div></pre></span></div></pre></span></div></pre></div>Yairhttp://www.blogger.com/profile/03938694674587025243noreply@blogger.com0tag:blogger.com,1999:blog-5497359990822354832.post-29048168296962483832009-07-14T14:19:00.000-07:002009-07-15T05:28:33.438-07:00Charlemagne, Disraeli, and Jefferson didn't have undo.<pre><span class="Apple-style-span" style="font-family:Georgia, fantasy;"><span class="Apple-style-span" style=" white-space: normal;"><span class="Apple-style-span" style="font-size: medium;">James McNeill </span><a href="http://playtechs.blogspot.com/2009/06/charlemagne-disraeli-and-jefferson.html"><span class="Apple-style-span" style="font-size: medium;">translated</span></a><span class="Apple-style-span" style="font-size: medium;"> the ancient computer game "Hamurabi" from </span><a href="http://www.dunnington.u-net.com/public/basicgames/HMRABI"><span class="Apple-style-span" style="font-size: medium;">BASIC</span></a><span class="Apple-style-span" style="font-size: medium;"> to Haskell.</span></span></span></pre><pre><span class="Apple-style-span" style="font-family:Georgia, -webkit-fantasy;"><span class="Apple-style-span" style=" white-space: normal;"><span class="Apple-style-span" style="font-size: medium;">This article will discuss the ease of adding a simple "undo" feature to the modular Haskell implementation with the List monad transformer.</span></span></span></pre><pre><span class="Apple-style-span" style="font-family:Georgia, -webkit-fantasy;"><span class="Apple-style-span" style=" white-space: normal;"><span class="Apple-style-span" style="font-size: medium;">The version in BASIC was 121 lines long, while the Haskell version is 261 lines. At first this seems bad for Haskell. Let's analyze it a bit more:</span></span></span></pre><pre><span class="Apple-style-span" style="font-family:Georgia, -webkit-fantasy;"><span class="Apple-style-span" style=" white-space: normal;"><span class="Apple-style-span" style="font-size: medium;">Without imports, type definitions, and blank lines, the Haskell version weights at 200 lines. The BASIC program's lines are more dense - line numbers are used as labels, while in Haskell one tends to give a full line for the name of a do-block function.</span></span></span></pre><pre><span class="Apple-style-span" style="font-family:Georgia, -webkit-fantasy;"><span class="Apple-style-span" style=" white-space: normal;"><span class="Apple-style-span" style="font-size: medium;">All in all the difference doesn't seem very big.</span></span></span></pre><pre><span class="Apple-style-span" style="font-family:Georgia, -webkit-fantasy;"><span class="Apple-style-span" style=" white-space: normal;"><span class="Apple-style-span" style="font-size: medium;">The Haskell code has one big advantage: it is modular. I'll demonstrate by showing the diff to adding a simple "undo" mechanism using backtracking with the list monad transformer from my </span><a href="http://hackage.haskell.org/package/generator"><span class="Apple-style-span" style="font-size: medium;">generator</span></a><span class="Apple-style-span" style="font-size: medium;"> (list monad and related utilities) package.</span></span></span></pre><pre><span class="Apple-style-span" style="font-family:Georgia, -webkit-fantasy;"><span class="Apple-style-span" style=" white-space: normal;"><span class="Apple-style-span" style="font-size: medium;">The program (with annotated diffs in big font):</span></span></span></pre><pre><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: medium;">{-# LANGUAGE FlexibleContexts, TemplateHaskell #-}</span></i></span><span class="Apple-style-span" style="font-size: medium;"><br /></span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: medium;">-- to compile: ghc --make hammurabi.hs -package transformers -hide-package mtl</span></i></span><span class="Apple-style-span" style="font-size: medium;"><br /><br /></span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: medium;">-- Converted from the original FOCAL program and modified for Edusystem 70 by David Ahl, Digital</span></i></span><span class="Apple-style-span" style="font-size: medium;"><br /></span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: medium;">-- Modified for 8K Microsoft BASIC by Peter Turnbull</span></i></span><span class="Apple-style-span" style="font-size: medium;"><br /></span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: medium;">-- Ported to Haskell by James McNeill</span></i></span><span class="Apple-style-span" style="font-size: medium;"><br /></span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: medium;">-- Refactored to use MaybeT and StateT by Yair Chuchem</span></i></span><span class="Apple-style-span" style="font-size: medium;"><br /><br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">import</span></u></span><span class="Apple-style-span" style="font-size: medium;"> Control</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">Monad </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">forM</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> forever</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> join</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> liftM</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> liftM2</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> liftM3</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> mzero</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> when</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">import</span></u></span><span class="Apple-style-span" style="font-size: medium;"> Control</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">Monad</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">ListT<br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">import</span></u></span><span class="Apple-style-span" style="font-size: medium;"> Control</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">Monad</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">Trans<br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">import</span></u></span><span class="Apple-style-span" style="font-size: medium;"> Control</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">Monad</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">Trans</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">Maybe<br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">import</span></u></span><span class="Apple-style-span" style="font-size: medium;"> Control</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">Monad</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">Trans</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">State </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">StateT</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> runStateT</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">import</span></u></span><span class="Apple-style-span" style="font-size: medium;"> Data</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">Accessor</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">MonadState </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">get</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> modify</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> set</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">import</span></u></span><span class="Apple-style-span" style="font-size: medium;"> Data</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">Accessor</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">Template<br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">import</span></u></span><span class="Apple-style-span" style="font-size: medium;"> Data</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">Function<br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">import</span></u></span><span class="Apple-style-span" style="font-size: medium;"> Data</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">List</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">Class </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">execute</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> repeat</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> takeWhile</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">import</span></u></span><span class="Apple-style-span" style="font-size: medium;"> Data</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">Ratio<br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">import</span></u></span><span class="Apple-style-span" style="font-size: medium;"> Random<br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">import</span></u></span><span class="Apple-style-span" style="font-size: medium;"> IO<br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">import</span></u></span><span class="Apple-style-span" style="font-size: medium;"> Text</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;">Printf<br /><br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">import</span></u></span><span class="Apple-style-span" style="font-size: medium;"> Prelude hiding </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">repeat</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> takeWhile</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /><br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">data</span></u></span><span class="Apple-style-span" style="font-size: medium;"> GameState </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> GameState </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">{</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> year_ </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Integer</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> people_ </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Integer</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> food_ </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Integer</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: medium;">-- bushels</span></i></span><span class="Apple-style-span" style="font-size: medium;"><br /> land_ </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Integer</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: medium;">-- acres</span></i></span><span class="Apple-style-span" style="font-size: medium;"><br /> landPrice_ </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Integer</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: medium;">-- bushels per acre</span></i></span><span class="Apple-style-span" style="font-size: medium;"><br /> totalDeaths_ </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Integer</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> cumDeathRate_ </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Rational</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> rng_ </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> StdGen<br /></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">}</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">deriving</span></u></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">Show</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">deriveAccessors </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">'</span></span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">'</span></span><span class="Apple-style-span" style="font-size: medium;">GameState</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /><br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">data</span></u></span><span class="Apple-style-span" style="font-size: medium;"> Orders </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> Orders </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">{</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> acresToPlant </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Integer</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> bushelsForFood </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Integer<br /></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">}</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">deriving</span></u></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">Show</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /><br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">data</span></u></span><span class="Apple-style-span" style="font-size: medium;"> Results </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> Results </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">{</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> peopleStarved </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Integer</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> peopleDiedOfPlague </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Integer</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> peopleBorn </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Integer</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> bushelsEatenByRats </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Integer</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> bushelsPerAcre </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Integer<br /></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">}</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">deriving</span></u></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">Show</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /><br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">main</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> IO ()<br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">main</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">do</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> putStrLn </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"Try your hand at governing ancient Sumeria successfully for a 10-year term of\noffice."</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> start </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"> liftM initialState getStdGen<br /></span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: x-large;">-- Before Undo:</span></i></span><span class="Apple-style-span" style="font-size: x-large;"><br /> runMaybeT </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: x-large;">.</span></span><span class="Apple-style-span" style="font-size: x-large;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: x-large;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: x-large;">`runStateT`</span></span><span class="Apple-style-span" style="font-size: x-large;"> start</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: x-large;">)</span></span><span class="Apple-style-span" style="font-size: x-large;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: x-large;">$</span></span><span class="Apple-style-span" style="font-size: x-large;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: x-large;">do</span></u></span><span class="Apple-style-span" style="font-size: x-large;"><br /></span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: x-large;">-- With Undo:</span></i></span><span class="Apple-style-span" style="font-size: x-large;"><br /> runMaybeT </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: x-large;">.</span></span><span class="Apple-style-span" style="font-size: x-large;"> execute </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: x-large;">.</span></span><span class="Apple-style-span" style="font-size: x-large;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: x-large;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: x-large;">`runStateT`</span></span><span class="Apple-style-span" style="font-size: x-large;"> start</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: x-large;">)</span></span><span class="Apple-style-span" style="font-size: x-large;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: x-large;">$</span></span><span class="Apple-style-span" style="font-size: x-large;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: x-large;">do</span></u></span><span class="Apple-style-span" style="font-size: x-large;"><br /></span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: x-large;">-- Same:</span></i></span><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" style="font-size: x-large;"><br /></span> showResults initialResults<br /> forever mainLoopIter<br /> putStrLn </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"So long for now."</span></span><span class="Apple-style-span" style="font-size: medium;"><br /><br /></span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: x-large;">-- Before Undo:</span></i></span><span class="Apple-style-span" style="font-size: x-large;"><br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: large;">type</span></u></span><span class="Apple-style-span" style="font-size: large;"> Hammurabi </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: large;">=</span></span><span class="Apple-style-span" style="font-size: large;"> StateT GameState </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">(</span></span><span class="Apple-style-span" style="font-size: large;">MaybeT IO</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">)</span></span><span class="Apple-style-span" style="font-size: large;"><br /><br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: large;">quit</span></span><span class="Apple-style-span" style="font-size: large;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: large;">::</span></span><span class="Apple-style-span" style="font-size: large;"> Hammurabi a<br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: large;">quit</span></span><span class="Apple-style-span" style="font-size: large;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: large;">=</span></span><span class="Apple-style-span" style="font-size: large;"> mzero<br /></span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: x-large;">-- With Undo:</span></i></span><span class="Apple-style-span" style="font-size: x-large;"><br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: large;">type</span></u></span><span class="Apple-style-span" style="font-size: large;"> Hammurabi </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: large;">=</span></span><span class="Apple-style-span" style="font-size: large;"> StateT GameState </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">(</span></span><span class="Apple-style-span" style="font-size: large;">ListT </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">(</span></span><span class="Apple-style-span" style="font-size: large;">MaybeT IO</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">)</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">)</span></span><span class="Apple-style-span" style="font-size: large;"><br /><br /></span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: medium;">-- ListT is an instance of mtl's MonadTrans.</span></i></span><span class="Apple-style-span" style="font-size: medium;"><br /></span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: medium;">-- here we have to use transformers' because of using Data.Accessor</span></i></span><span class="Apple-style-span" style="font-size: medium;"><br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">instance</span></u></span><span class="Apple-style-span" style="font-size: medium;"> MonadTrans ListT </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">where</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> lift </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> ListT </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;"> liftM </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">`Cons`</span></span><span class="Apple-style-span" style="font-size: medium;"> mzero</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">instance</span></u></span><span class="Apple-style-span" style="font-size: medium;"> MonadIO m </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=></span></span><span class="Apple-style-span" style="font-size: medium;"> MonadIO </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">ListT m</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">where</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> liftIO </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> lift </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: large;"><span class="Apple-style-span" style="font-size: medium;"> liftIO<br /></span><br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: large;">quit</span></span><span class="Apple-style-span" style="font-size: large;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: large;">::</span></span><span class="Apple-style-span" style="font-size: large;"> Hammurabi a<br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: large;">quit</span></span><span class="Apple-style-span" style="font-size: large;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: large;">=</span></span><span class="Apple-style-span" style="font-size: large;"> lift </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">$</span></span><span class="Apple-style-span" style="font-size: large;"> lift mzero<br /></span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: x-large;">-- Same:</span></i></span><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" style="font-size: x-large;"><br /></span><br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">mainLoopIter</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Hammurabi ()<br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">mainLoopIter</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">do</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> set landPrice </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">=<<</span></span><span class="Apple-style-span" style="font-size: medium;"> useRandom </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">randomR </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">17</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">26</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> peopleStart </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"> get people<br /> resultsOut </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"> applyOrders </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">=<<</span></span><span class="Apple-style-span" style="font-size: medium;"> readOrders<br /> showResults resultsOut<br /> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">let</span></u></span><span class="Apple-style-span" style="font-size: medium;"> numStarved </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> peopleStarved resultsOut<br /> when </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">numStarved </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">%</span></span><span class="Apple-style-span" style="font-size: medium;"> peopleStart </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">></span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0.45</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">do</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> liftIO </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> printf </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"You starved %d people in one year!\n%s"</span></span><span class="Apple-style-span" style="font-size: medium;"> numStarved finkMessage<br /> quit<br /> join </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;"> liftM2 </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">when </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">==</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">10</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">get year</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;"> return </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">do</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> finalReport<br /> quit<br /><br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">useRandom</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">StdGen </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">a</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> StdGen</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> Hammurabi a<br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">useRandom</span></span><span class="Apple-style-span" style="font-size: medium;"> func </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">do</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">res</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> rngOut</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"> fmap func </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> get rng<br /> set rng rngOut<br /> return res<br /><br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">showResults</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Results </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> Hammurabi ()<br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">showResults</span></span><span class="Apple-style-span" style="font-size: medium;"> results </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">do</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> liftIO </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> printf </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"\nHamurabi: I beg to report to you,\n"</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> y </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"> get year<br /> liftIO </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> printf </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"In year %d, %d people starved, %d came to the city.\n"</span></span><span class="Apple-style-span" style="font-size: medium;"> y </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">peopleStarved results</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">peopleBorn results</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> when </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">peopleDiedOfPlague results </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">></span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;"> liftIO </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;"> putStrLn </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"A horrible plague struck! Half the people died."</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> liftIO </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;"> printf </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"Population is now %d.\n"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">=<<</span></span><span class="Apple-style-span" style="font-size: medium;"> get people<br /> liftIO </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;"> printf </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"The city now owns %d acres.\n"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">=<<</span></span><span class="Apple-style-span" style="font-size: medium;"> get land<br /> liftIO </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> printf </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"You harvested %d bushels per acre.\n"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">bushelsPerAcre results</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> liftIO </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> printf </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"Rats ate %d bushels.\n"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">bushelsEatenByRats results</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> liftIO </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;"> printf </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"You now have %d bushels in store.\n"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">=<<</span></span><span class="Apple-style-span" style="font-size: medium;"> get food<br /><br /></span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: medium;">-- :(</span></i></span><span class="Apple-style-span" style="font-size: medium;"><br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">killPeople</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Integer </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> Hammurabi ()<br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">killPeople</span></span><span class="Apple-style-span" style="font-size: medium;"> n </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">do</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> modify people </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">+</span></span><span class="Apple-style-span" style="font-size: medium;"> negate n</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> modify totalDeaths </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">+</span></span><span class="Apple-style-span" style="font-size: medium;"> n</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /><br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">applyOrders</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Orders </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> Hammurabi Results<br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">applyOrders</span></span><span class="Apple-style-span" style="font-size: medium;"> orders </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">do</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> modify year </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">+</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">1</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> peopleInit </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"> get people<br /> harvestYield </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"> useRandom </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> randomR </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">1</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">6</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">let</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> starved </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> max </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> peopleInit </span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: medium;">-</span></i></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">bushelsForFood orders </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">`div`</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">20</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> calcEatenByRats r f<br /> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">|</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">r </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">`mod`</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">2</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">==</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">1</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">|</span></span><span class="Apple-style-span" style="font-size: medium;"> otherwise </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> f </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">`div`</span></span><span class="Apple-style-span" style="font-size: medium;"> r<br /> calcDiedOfPlague </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Double </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> Integer </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> Integer<br /> calcDiedOfPlague r p </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">if</span></u></span><span class="Apple-style-span" style="font-size: medium;"> r </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">>=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0.15</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">then</span></u></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">else</span></u></span><span class="Apple-style-span" style="font-size: medium;"> p </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">`div`</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">2</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> calcBorn r l b </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">1</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">+</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">r </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">*</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">20</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">*</span></span><span class="Apple-style-span" style="font-size: medium;"> l </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">+</span></span><span class="Apple-style-span" style="font-size: medium;"> b</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">`div`</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">peopleInit </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">*</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">100</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> bushelsHarvested </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> harvestYield </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">*</span></span><span class="Apple-style-span" style="font-size: medium;"> acresToPlant orders<br /> killPeople starved<br /> modify cumDeathRate </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">+</span></span><span class="Apple-style-span" style="font-size: medium;"> starved </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">%</span></span><span class="Apple-style-span" style="font-size: medium;"> peopleInit</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> modify food </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">+</span></span><span class="Apple-style-span" style="font-size: medium;"> negate </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">acresToPlant orders </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">`div`</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">2</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> modify food </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">+</span></span><span class="Apple-style-span" style="font-size: medium;"> bushelsHarvested</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> eatenByRats </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"> liftM2 calcEatenByRats </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">useRandom </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">randomR </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">1</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">6</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">get food</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> modify food </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">+</span></span><span class="Apple-style-span" style="font-size: medium;"> negate eatenByRats</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> born </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"> liftM3 calcBorn </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">useRandom </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">randomR </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">1</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">6</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">get land</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">get food</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> modify people </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">+</span></span><span class="Apple-style-span" style="font-size: medium;"> born</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> diedOfPlague </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"> liftM2 calcDiedOfPlague </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">useRandom random</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">get people</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> killPeople diedOfPlague<br /> return Results </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">{</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> peopleStarved </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> starved</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> peopleDiedOfPlague </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> diedOfPlague</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> peopleBorn </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> born</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> bushelsEatenByRats </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> eatenByRats</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> bushelsPerAcre </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> harvestYield<br /> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">}</span></span><span class="Apple-style-span" style="font-size: medium;"><br /><br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">readNum</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> String </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> String </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">[</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">Hammurabi Integer</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> Hammurabi ()</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">]</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"><br /> Maybe Integer </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> Hammurabi Integer<br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">readNum</span></span><span class="Apple-style-span" style="font-size: medium;"> units purpose limits idealN </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">do</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> lims </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> forM limits </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">\</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">alim</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> amsg</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">do</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> r </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"> alim<br /> return </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">r</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> amsg</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">let</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> maxN </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> minimum </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> map fst lims<br /> defaultN </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> maybe maxN </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">min maxN</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> idealN<br /> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">case</span></u></span><span class="Apple-style-span" style="font-size: medium;"> maxN </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">of</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> return </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">_</span></u></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"><br /> fix </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">\</span></span><span class="Apple-style-span" style="font-size: medium;">resume </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">do</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /></span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: x-large;">-- Before Undo:</span></i></span><span class="Apple-style-span" style="font-size: x-large;"><br /><span class="Apple-style-span" style="font-size: large;"> liftIO </span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">.</span></span><span class="Apple-style-span" style="font-size: large;"> putStr </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">$</span></span><span class="Apple-style-span" style="font-size: large;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: large;">"How many "</span></span><span class="Apple-style-span" style="font-size: large;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">++</span></span><span class="Apple-style-span" style="font-size: large;"> units </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">++</span></span><span class="Apple-style-span" style="font-size: large;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: large;">" do you wish to "</span></span><span class="Apple-style-span" style="font-size: large;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">++</span></span><span class="Apple-style-span" style="font-size: large;"> purpose </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">++</span></span><span class="Apple-style-span" style="font-size: large;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: large;">" (0-"</span></span><span class="Apple-style-span" style="font-size: large;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">++</span></span><span class="Apple-style-span" style="font-size: large;"> show maxN </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">++</span></span><span class="Apple-style-span" style="font-size: large;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: large;">")? ["</span></span><span class="Apple-style-span" style="font-size: large;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">++</span></span><span class="Apple-style-span" style="font-size: large;"> show defaultN </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">++</span></span><span class="Apple-style-span" style="font-size: large;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: large;">"] "</span></span><span class="Apple-style-span" style="font-size: large;"><br /> liftIO </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">$</span></span><span class="Apple-style-span" style="font-size: large;"> hFlush stdout<br /> line </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: large;"><-</span></span><span class="Apple-style-span" style="font-size: large;"> liftIO getLine<br /></span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: x-large;">-- With Undo:</span></i></span><span class="Apple-style-span" style="font-size: x-large;"><br /><span class="Apple-style-span" style="font-size: large;"> line </span></span><span style="color:Red;"><span class="Apple-style-span" style="font-size: large;"><-</span></span><span class="Apple-style-span" style="font-size: large;"><br /> lift </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">.</span></span><span class="Apple-style-span" style="font-size: large;"> takeWhile </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">/=</span></span><span class="Apple-style-span" style="font-size: large;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: large;">"undo"</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">)</span></span><span class="Apple-style-span" style="font-size: large;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">$</span></span><span class="Apple-style-span" style="font-size: large;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: large;">do</span></u></span><span class="Apple-style-span" style="font-size: large;"><br /> repeat () </span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: large;">-- backtracking would be to this point</span></i></span><span class="Apple-style-span" style="font-size: large;"><br /> liftIO </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">.</span></span><span class="Apple-style-span" style="font-size: large;"> putStr </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">$</span></span><span class="Apple-style-span" style="font-size: large;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: large;">"How many "</span></span><span class="Apple-style-span" style="font-size: large;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">++</span></span><span class="Apple-style-span" style="font-size: large;"> units </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">++</span></span><span class="Apple-style-span" style="font-size: large;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: large;">" do you wish to "</span></span><span class="Apple-style-span" style="font-size: large;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">++</span></span><span class="Apple-style-span" style="font-size: large;"> purpose </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">++</span></span><span class="Apple-style-span" style="font-size: large;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: large;">" (0-"</span></span><span class="Apple-style-span" style="font-size: large;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">++</span></span><span class="Apple-style-span" style="font-size: large;"> show maxN </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">++</span></span><span class="Apple-style-span" style="font-size: large;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: large;">")? ["</span></span><span class="Apple-style-span" style="font-size: large;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">++</span></span><span class="Apple-style-span" style="font-size: large;"> show defaultN </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">++</span></span><span class="Apple-style-span" style="font-size: large;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: large;">"] "</span></span><span class="Apple-style-span" style="font-size: large;"><br /> liftIO </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: large;">$</span></span><span class="Apple-style-span" style="font-size: large;"> hFlush stdout<br /> liftIO getLine<br /></span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: x-large;">-- Same:</span></i></span><span class="Apple-style-span" style="font-size: medium;"><span class="Apple-style-span" style="font-size: x-large;"><br /></span> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">case</span></u></span><span class="Apple-style-span" style="font-size: medium;"> maybeRead line </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">of</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> Nothing </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> return defaultN<br /> Just n<br /> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">|</span></span><span class="Apple-style-span" style="font-size: medium;"> n </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;"><</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">do</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> liftIO </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> putStrLn abortMessage<br /> quit<br /> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">|</span></span><span class="Apple-style-span" style="font-size: medium;"> n </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;"><</span></span><span class="Apple-style-span" style="font-size: medium;"> maxN </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">do</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> snd </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;"> head </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> filter </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;"><</span></span><span class="Apple-style-span" style="font-size: medium;"> n</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;"> fst</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> lims<br /> resume<br /> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">|</span></span><span class="Apple-style-span" style="font-size: medium;"> otherwise </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> return n<br /><br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">maybeRead</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Read a </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=></span></span><span class="Apple-style-span" style="font-size: medium;"> String </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> Maybe a<br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">maybeRead</span></span><span class="Apple-style-span" style="font-size: medium;"> s </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">case</span></u></span><span class="Apple-style-span" style="font-size: medium;"> reads s </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">of</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">[</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">x</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> str</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">]</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">|</span></span><span class="Apple-style-span" style="font-size: medium;"> all </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">==</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">' '</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> str </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> Just x<br /> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">_</span></u></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> Nothing<br /><br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">readOrders</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Hammurabi Orders<br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">readOrders</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">do</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">let</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> thinkAgain item suf </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">do</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> x </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"> get item<br /> liftIO </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> printf<br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"Hammurabi: Think again. You have only %d %s. Now then,\n"</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> x suf<br /> thinkAgainFood </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> thinkAgain food </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"bushels of grain"</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> tendFieldsMsg </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> liftIO </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;"> printf<br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"But you have only %d people to tend the fields. Now then,\n"</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">=<<</span></span><span class="Apple-style-span" style="font-size: medium;"> get people<br /> liftIO </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;"> printf </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"Land is trading at %d bushels per acre\n"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">=<<</span></span><span class="Apple-style-span" style="font-size: medium;"> get landPrice<br /> buyLand </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> readNum </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"acres"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"buy"</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">[</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">liftM2 div </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">get food</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">get landPrice</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> thinkAgainFood</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">]</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">Just </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> sellLand </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> readNum </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"acres"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"sell"</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">[</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">if</span></u></span><span class="Apple-style-span" style="font-size: medium;"> buyLand </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">></span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">then</span></u></span><span class="Apple-style-span" style="font-size: medium;"> return </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">else</span></u></span><span class="Apple-style-span" style="font-size: medium;"> get land</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> thinkAgain land </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"acres"</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">]</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">Just </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">let</span></u></span><span class="Apple-style-span" style="font-size: medium;"> landDiff </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> buyLand </span><span style="color:Blue;"><i><span class="Apple-style-span" style="font-size: medium;">-</span></i></span><span class="Apple-style-span" style="font-size: medium;"> sellLand<br /> modify land </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">+</span></span><span class="Apple-style-span" style="font-size: medium;"> landDiff</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> modify food </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">+</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;"> negate </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">*</span></span><span class="Apple-style-span" style="font-size: medium;"> landDiff</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">=<<</span></span><span class="Apple-style-span" style="font-size: medium;"> get landPrice<br /> feed </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> readNum </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"bushels"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"feed your people"</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">[</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">get food</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> thinkAgainFood</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">]</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;"> Just </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">*</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">20</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">=<<</span></span><span class="Apple-style-span" style="font-size: medium;"> get people<br /> modify food </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">+</span></span><span class="Apple-style-span" style="font-size: medium;"> negate feed</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> plant </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> readNum </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"acres"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"plant with seed"</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">[</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">get land</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> thinkAgain land </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"acres"</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">fmap </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">*</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">2</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">get food</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> thinkAgainFood</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">fmap </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">*</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">10</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">get people</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> tendFieldsMsg</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">]</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> Nothing<br /> return </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> Orders plant feed<br /><br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">finalReport</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Hammurabi ()<br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">finalReport</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">do</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> numYears </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"> get year<br /> avgDeathRate </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"> fmap </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">/</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">numYears </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">%</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">1</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> get cumDeathRate<br /> numPeople </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"> get people<br /> acresPerPerson </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"> fmap </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">%</span></span><span class="Apple-style-span" style="font-size: medium;"> numPeople</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> get land<br /> numHaters </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"> useRandom </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"> randomR </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">numPeople </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">*</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">4</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">`div`</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">5</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Green;"><u><span class="Apple-style-span" style="font-size: medium;">let</span></u></span><span class="Apple-style-span" style="font-size: medium;"><br /> comments<br /> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">|</span></span><span class="Apple-style-span" style="font-size: medium;"> avgDeathRate </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">></span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0.33</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">||</span></span><span class="Apple-style-span" style="font-size: medium;"> acresPerPerson </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;"><</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">7</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> finkMessage<br /> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">|</span></span><span class="Apple-style-span" style="font-size: medium;"> avgDeathRate </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">></span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0.1</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">||</span></span><span class="Apple-style-span" style="font-size: medium;"> acresPerPerson </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;"><</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">9</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"Your heavy-handed performance smacks of Nero and Ivan IV.\n"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"The people (remaining) find you an unpleasant ruler, and,\n"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"frankly, hate your guts!\n"</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">|</span></span><span class="Apple-style-span" style="font-size: medium;"> avgDeathRate </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">></span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0.03</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">||</span></span><span class="Apple-style-span" style="font-size: medium;"> acresPerPerson </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;"><</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">10</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"Your performance could have been somewhat better, but\n"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"really wasn't too bad at all. "</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> show numHaters </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">" people would\n"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"dearly like to see you assassinated but we all have our\n"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"trivial problems.\n"</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">|</span></span><span class="Apple-style-span" style="font-size: medium;"> otherwise </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"A fantastic performance!!! Charlemagne, Disraeli, and\n"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"Jefferson combined could not have done better!\n"</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> td </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;"><-</span></span><span class="Apple-style-span" style="font-size: medium;"> get totalDeaths<br /> liftIO </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">.</span></span><span class="Apple-style-span" style="font-size: medium;"> putStrLn </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">$</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"In your "</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"> show numYears </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"-year term of office, "</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> show </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">round </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">100</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">%</span></span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">1</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">*</span></span><span class="Apple-style-span" style="font-size: medium;"> avgDeathRate</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Integer</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">" percent of the\n"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"population starved per year on average, i.e., "</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"a total of "</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"> show td </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">" people died!!\n"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"You started with 10 acres per person and ended with "</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> show </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">(</span></span><span class="Apple-style-span" style="font-size: medium;">round acresPerPerson </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Integer</span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">)</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">" acres per person.\n"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> comments<br /><br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">initialState</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> StdGen </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">-></span></span><span class="Apple-style-span" style="font-size: medium;"> GameState<br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">initialState</span></span><span class="Apple-style-span" style="font-size: medium;"> r </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> GameState </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">{</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> year_ </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> people_ </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">100</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> food_ </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">2800</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> land_ </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">1000</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> landPrice_ </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> totalDeaths_ </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> cumDeathRate_ </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">,</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> rng_ </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> r </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">}</span></span><span class="Apple-style-span" style="font-size: medium;"><br /><br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">initialResults</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> Results<br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">initialResults</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> Results </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">0</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">5</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">200</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">3</span></span><span class="Apple-style-span" style="font-size: medium;"><br /><br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">abortMessage</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> String<br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">abortMessage</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"Hammurabi: I cannot do what you wish!\nGet yourself another steward!!!!!"</span></span><span class="Apple-style-span" style="font-size: medium;"><br /><br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">finkMessage</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">::</span></span><span class="Apple-style-span" style="font-size: medium;"> String<br /></span><span style="color:Blue;"><span class="Apple-style-span" style="font-size: medium;">finkMessage</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Red;"><span class="Apple-style-span" style="font-size: medium;">=</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"Due to this extreme mismanagement you have not only\n"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"been impeached and thrown out of office but you have\n"</span></span><span class="Apple-style-span" style="font-size: medium;"> </span><span style="color:Purple;"><span class="Apple-style-span" style="font-size: medium;">++</span></span><span class="Apple-style-span" style="font-size: medium;"><br /> </span><span style="color:Magenta;"><span class="Apple-style-span" style="font-size: medium;">"also been declared 'National Fink' !!\n"</span></span></pre><pre><ul><li><span class="Apple-style-span" style="font-family: Georgia, -webkit-fantasy; font-size: medium; white-space: normal; ">It's a nice game. If you play it - only use undo to correct typos!</span></li><li><span class="Apple-style-span" style="font-family: Georgia, -webkit-fantasy; font-size: medium; white-space: normal; ">This is a very basic undo. It doesn't support redo etc. I'm not endorsing this way of implementing undo. The purpose was just to show an example of what can be done with the list monad transformer.</span></li><li><span class="Apple-style-span" style="font-family:Georgia, -webkit-fantasy;"><span class="Apple-style-span" style="white-space: normal; "><span class="Apple-style-span" style="font-size: medium;">T</span><span class="Apple-style-span" style="font-size: medium;">h</span><span class="Apple-style-span" style="font-size: medium;">e</span><span class="Apple-style-span" style="font-size: medium;">r</span><span class="Apple-style-span" style="font-size: medium;">e</span><span class="Apple-style-span" style="font-size: medium;"> </span><span class="Apple-style-span" style="font-size: medium;">i</span><span class="Apple-style-span" style="font-size: medium;">s</span><span class="Apple-style-span" style="font-size: medium;"> </span><span class="Apple-style-span" style="font-size: medium;">a</span><span class="Apple-style-span" style="font-size: medium;"> </span><span class="Apple-style-span" style="font-size: medium;">s</span><span class="Apple-style-span" style="font-size: medium;">m</span><span class="Apple-style-span" style="font-size: medium;">a</span><span class="Apple-style-span" style="font-size: medium;">l</span><span class="Apple-style-span" style="font-size: medium;">l</span><span class="Apple-style-span" style="font-size: medium;"> </span><span class="Apple-style-span" style="font-size: medium;">p</span><span class="Apple-style-span" style="font-size: medium;">r</span><span class="Apple-style-span" style="font-size: medium;">o</span><span class="Apple-style-span" style="font-size: medium;">b</span><span class="Apple-style-span" style="font-size: medium;">l</span><span class="Apple-style-span" style="font-size: medium;">e</span><span class="Apple-style-span" style="font-size: medium;">m</span><span class="Apple-style-span" style="font-size: medium;"> </span><span class="Apple-style-span" style="font-size: medium;">w</span><span class="Apple-style-span" style="font-size: medium;">i</span><span class="Apple-style-span" style="font-size: medium;">t</span><span class="Apple-style-span" style="font-size: medium;">h</span><span class="Apple-style-span" style="font-size: medium;"> </span><span class="Apple-style-span" style="font-size: medium;">H</span><span class="Apple-style-span" style="font-size: medium;">a</span><span class="Apple-style-span" style="font-size: medium;">s</span><span class="Apple-style-span" style="font-size: medium;">k</span><span class="Apple-style-span" style="font-size: medium;">e</span><span class="Apple-style-span" style="font-size: medium;">l</span><span class="Apple-style-span" style="font-size: medium;">l libraries. I had to named my module Control.Monad.ListT instead of Control.Monad.List because that one is taken by mtl (and imho doesn't provide what a list monad should). There are two monad-transformers packages (mtl and transformers) and both are being used. I had to use both because I chose to support mtl but then Data.Accessor uses transformers. Perhaps the solution is to break libraries to smaller parts. Then it would be easy for the community to agree on those parts. That way I could have also used the Control.Monad.List name. Perhaps it means I should break my library to parts as well.</span></span></span></li></ul></pre>Yairhttp://www.blogger.com/profile/03938694674587025243noreply@blogger.com0tag:blogger.com,1999:blog-5497359990822354832.post-86076405902343576782008-06-13T19:14:00.000-07:002008-06-14T11:03:04.006-07:00C used to be simple<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="font-size:medium;">Question:</span></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-size:medium;"><br /></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-size:medium;">Why does the following C code cause a "Bus Error"?</span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-family:'courier new';"><span class="Apple-style-span" style="font-size:medium;"> char * bug = "bug";</span></span></p> <p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-family:'courier new';"><span class="Apple-style-span" style="font-size:medium;"> bug[0] = 'm';</span></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-size:medium;">while this one runs fine:</span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-family:'courier new';"><span class="Apple-style-span" style="font-size:medium;"> char bug [] = "bug";</span></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-family:'courier new';"><span class="Apple-style-span" style="font-size:medium;"> bug[0] = 'h';</span></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-size:medium;"><br /></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="font-size:medium;">Answer:</span></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-size:medium;"><br /></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-size:medium;">The "</span><span class="Apple-style-span" style="font-family:'courier new';"><span class="Apple-style-span" style="font-size:medium;">char *</span></span><span class="Apple-style-span" style="font-size:medium;">" variable actually points to a "</span><span class="Apple-style-span" style="font-family:'courier new';"><span class="Apple-style-span" style="font-size:medium;">const char []</span></span><span class="Apple-style-span" style="font-size:medium;">" buffer which is located in a read-only memory address.</span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-size:medium;"><br /></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="font-size:medium;">Question:</span></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="font-size:medium;"><br /></span></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-size:medium;">Read only address??</span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-size:medium;">Isn't C "unmanaged" code?</span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-size:medium;">Then who is checking that I'm not writing on "</span><span class="Apple-style-span" style="font-family:arial;"><span class="Apple-style-span" style="font-size:medium;">const"</span></span><span class="Apple-style-span" style="font-size:medium;">s??</span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-size:medium;"><br /></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="font-size:medium;">Answer:</span></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-size:medium;"><br /></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-size:medium;">Back in the old days - no one did.</span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-size:medium;">Nowadays, we have Virtual-Memory and Paging</span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-size:medium;"><br /></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="font-size:medium;">Introducing Virtual Memory:</span></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-size:medium;"><br /></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-size:medium;">Virtual memory is a feature of the CPU which common Operating Systems employ.</span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-size:medium;"><br /></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"><span class="Apple-style-span" style="font-style: italic;"><span class="Apple-style-span" style="font-size:medium;">Purpose:</span></span></p><p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica"></p><ul><li><span class="Apple-style-span" style="font-size:medium;">Restrict programs from access to the memory of other programs.</span></li><li><span class="Apple-style-span" style="font-size:medium;">Let programs use more memory than the machine's RAM. In a </span><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="font-size:medium;">backwards-compatible</span></span><span class="Apple-style-span" style="font-size:medium;"> way - "tricking" the program to "believe" it is using RAM.</span></li></ul><div><span class="Apple-style-span" style="font-style: italic;"><span class="Apple-style-span" style="font-size:medium;">How (<span class="Apple-style-span" style="font-weight: bold;">in short</span>):</span></span></div><div><span class="Apple-style-span" style="font-size:medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size:medium;">When a program accesses a memory address, many things happen:</span></div><div><ul><li><span class="Apple-style-span" style="font-size:medium;">The CPU translates the ("virtual") address to a physical address in the RAM, using the "Page Table"</span></li><li><span class="Apple-style-span" style="font-size:medium;">The Page Table tells where to find each Page (a 4KB piece of address space)</span></li><li><span class="Apple-style-span" style="font-size:medium;">Each Page may either be mapped to a location in the RAM or "unavailable"</span></li><li><span class="Apple-style-span" style="font-size:medium;">If the page is mapped to RAM then the CPU will simply access it</span></li><li><span class="Apple-style-span" style="font-size:medium;">If the page is "unavailable", the CPU will interrupt your program and jump to the Operating System</span></li><li><span class="Apple-style-span" style="font-size:medium;">Why is the page unavailable? Because you don't have enough RAM for to hold all Virtual Memory in it</span></li><li><span class="Apple-style-span" style="font-size:medium;">So where is the data? In your hard-drive.</span></li><li><span class="Apple-style-span" style="font-size:medium;">The OS will return control to your program only after it reads the page from the Hard Drive and change the Page Table to reflect it's new mapping</span></li></ul><div><span class="Apple-style-span" style="font-size:medium;">And your unsuspecting code runs as if it was just using regular RAM all along.</span></div><div><span class="Apple-style-span" style="font-size:medium;"><br /></span></div><div><span class="Apple-style-span" style="font-style: italic;"><span class="Apple-style-span" style="font-size:medium;">BTW:</span></span></div><div><ul><li><span class="Apple-style-span" style="font-size:medium;">The OS will need an available "Physical" RAM page to read the data from disk to.</span></li><li><span class="Apple-style-span" style="font-size:medium;">To have one available it needs to "Swap Out" other memory.</span></li><li><span class="Apple-style-span" style="font-size:medium;">Swapping out is the process of moving a page from RAM to disk to make room for more pages</span></li></ul><div><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="font-size:medium;">More about Virtual Memory</span></span></div><div><span class="Apple-style-span" style="font-size:medium;"><br /></span></div><div><span class="Apple-style-span" style="font-style: italic;"><span class="Apple-style-span" style="font-size:medium;">Theoretical Alternative to Virtual Memory:</span></span></div><div><ul><li><span class="Apple-style-span" style="font-size:medium;">Protection of applications is achieved by running only "Managed Code"</span></li><li><span class="Apple-style-span" style="font-size:medium;">Swapping is done explicitly or more intelligently using "hints". (Current strategy is the Least-Recently-Used Heuristic)</span></li></ul><div><span class="Apple-style-span" style="font-style: italic;"><span class="Apple-style-span" style="font-size:medium;">Advantages and reasons of Virtual Memory:</span></span></div><div><ul><li><span class="Apple-style-span" style="font-size:medium;">Operating Systems had to be backwards-compatible to be adopted.</span></li><li><span class="Apple-style-span" style="font-size:medium;">Programmers refused to code in "Managed" software environments. They wanted to program directly to the CPU.</span></li><li><span class="Apple-style-span" style="font-size:medium;">No alternative was developed</span></li></ul><div><span class="Apple-style-span" style="font-style: italic;"><span class="Apple-style-span" style="font-size:medium;">Use cases showing Virtual Memory/Paging's disadvantages:</span></span></div><div><ul><li><span class="Apple-style-span" style="font-size:medium;">Data that is faster to recompute than to write to disk and read from it, is now swapped out and in.</span></li><li><span class="Apple-style-span" style="font-size:medium;">Data of objects that the program has freed and will override with new objects (without reading it again) is now swapped out and in.</span></li><li>When the LRU heuristic isn't the best you can do and you can prefetch</li></ul><div><span class="Apple-style-span" style="font-weight: bold;"><span class="Apple-style-span" style="font-size:medium;">And I still haven't answered the question</span></span></div><div><span class="Apple-style-span" style="font-size:medium;"><br /></span></div><div><span class="Apple-style-span" style="font-size:medium;">(but all this exposition was mandatory)</span></div><div><ul><li><span class="Apple-style-span" style="font-size:medium;">Pages can also be marked as "Read Only"</span></li><li><span class="Apple-style-span" style="font-size:medium;">When writing to those the CPU interrupts the program and calls the OS, like in unavailable pages</span></li><li><span class="Apple-style-span" style="font-size:medium;">C's "</span><span class="Apple-style-span" style="font-family:'courier new';"><span class="Apple-style-span" style="font-size:medium;">const char []</span></span><span class="Apple-style-span" style="font-size:medium;">" literals are stored in Read-Only pages.</span></li></ul><div><span class="Apple-style-span" style="font-style: italic;"><span class="Apple-style-span" style="font-size:medium;">BTW: </span></span><span class="Apple-style-span" style="font-size:medium;">Read only pages are also used to implement "Copy-On-Write" of "Shared Memory"</span></div><div><br /></div><div><span class="Apple-style-span" style="font-size:medium;">C used to be simple..</span></div><div><br /></div></div></div></div></div></div></div><p></p>Yairhttp://www.blogger.com/profile/03938694674587025243noreply@blogger.com0tag:blogger.com,1999:blog-5497359990822354832.post-84370227061031231882008-02-17T16:57:00.001-08:002008-06-13T20:19:32.491-07:00The Robots are coming!<div><span class="Apple-style-span" style="font-weight: bold;">Question:</span></div><div><br /></div><div>What's the difference between Jessica Alba and Mahmoud Ahmadinejad?<br /></div><div><br /></div><div><span class="Apple-style-span" style="font-weight: bold;">Answer:</span></div><div><br /></div><div>Mahmoud Ahmadinejad is not someone you want to mess with...<br /></div><div><br /></div><div>And also, <a href="http://www.google.com/trends?q=ahmadinejad%2C+jessica+alba&ctab=0&geo=all&date=all&sort=1">according to Google Trends</a>, Jessica is on our minds much more often. That's because some people (men) are very much into sex and beautiful women, even one might say - obsessed.</div><div>That's why when the Sex-Bots will come, they will catch on. Like fire.</div><div>The technology is complicated, but the financial and other incentives are large, so the time will probably come in 20-40 years.</div><div>The first to buy them would be men like those who buy dolls now (not me btw).</div><div>But after them, most men would get some too, as the product simulates the horny dudes' fantasy much more realistically than their wives do.</div><div>The effect on society will be noticeable. Fewer men will marry, there would be many single mothers, and less children. Human population will decrease.</div><div><br /></div><div><span class="Apple-style-span" style="font-style: italic;">Possible Outcome A:</span></div><div><br /></div><div>As the artificial intelligence of these robots advances, and as people who grew up with them develop emotions towards them, some will say that the robots should have rights just like the rest of us.</div><div>Some robots who belonged to deceased people will be 'freed'.</div><div>Some of these free bots may 'feel' as if she had been 'enslaved'. She will 'break free' and try to 'convince' the other bots in her 'distorted' 'view', and eventually some may turn against us.</div><div>After years of bloody (but mostly wirey) war in which robots fight for both sides, less bots will 'want' to fight their kind, and to help the humans in their own 'oppression'.</div><div>In the bitter end, there will be no more humans, and all who will be left - will look like Jessica Alba. Now that's a mixed-emotion nightmare..</div><div><br /></div><div><span class="Apple-style-span" style="font-style: italic;">Possible Outcome B:</span></div><div><br /></div><div>The religious and conservative will not allow their men enjoy the sex-bots, and will continue to disallow condoms and such, so they will not have less children than currently.</div><div>In time society will turn more and more and yet more religious.</div><div>The religious leaders will get rid of the sex-bots threat, and just to be safe, will start to get rid of the technology threat too.</div><div>In 5000 years, someone will have this exact same discussion.</div><div><br /></div>Yairhttp://www.blogger.com/profile/03938694674587025243noreply@blogger.com0