<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hi Tim,<div class=""><br class=""></div><div class="">Staying from clojure? :-)</div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Mar 22, 2015, at 12:33 PM, Timothy Washington <<a href="mailto:twashing@gmail.com" class="">twashing@gmail.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class=""><div class="">So I've finally had a chance to revisit my tictactoe game. </div><div class=""><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><div class=""><font color="#999999" class=""><br class="">import Control.Lens</font></div><div class=""><font color="#999999" class=""><br class=""></font></div><div class=""><font color="#999999" class="">data Piece = X | O | E deriving Show</font></div><div class=""><font color="#999999" class="">type Row = [Piece]</font></div><div class=""><font color="#999999" class="">type Board = [Row]</font></div><div class=""><b class=""><i class="">data Position = Int Int deriving Show</i></b></div><div class=""><br class=""></div><div class=""><font color="#999999" class="">-- put an X or O in a position</font></div><div class=""><b class=""><i class="">move :: Board -> Piece -> Position -> Board</i></b></div><div class=""><font color="#999999" class="">move board piece position = board</font></div><div class=""><br class=""></div><div class=""><font color="#999999" class="">main :: IO ()</font></div><div class=""><font color="#999999" class="">main = putStrLn "Hello World"</font></div><div class=""><font color="#999999" class=""><br class=""></font></div><div class=""><font color="#999999" class="">-- using Lenses</font></div><div class=""><font color="#999999" class="">-- <a href="https://github.com/ekmett/lens/wiki/Examples" class="">https://github.com/ekmett/lens/wiki/Examples</a></font></div><div class=""><font color="#999999" class="">-- <a href="http://lens.github.io/tutorial.html" class="">http://lens.github.io/tutorial.html</a></font></div><div class=""><font color="#999999" class="">-- <a href="http://blog.jakubarnold.cz/2014/07/14/lens-tutorial-introduction-part-1.html" class="">http://blog.jakubarnold.cz/2014/07/14/lens-tutorial-introduction-part-1.html</a></font></div><div class=""><font color="#999999" class=""><br class=""></font></div><div class=""><font color="#999999" class="">--let r1 = (E,E,E)</font></div><div class=""><font color="#999999" class="">--let r2 = (E,E,E)</font></div><div class=""><font color="#999999" class="">--let r3 = (E,E,E)</font></div><div class=""><font color="#999999" class="">--let board = (r1,r2,r3)</font></div></blockquote><div class=""><br class=""></div></div><div class="">Now, if I want to make a move, I'll want to set a <b class=""><i class="">piece</i></b> on a <b class=""><i class="">position</i></b>, on a <b class=""><i class="">board</i></b>. Let's assume the board has the following shape. </div><div class=""><br class=""></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><div class=""><div class=""><span style="" class="">λ></span><span style="" class=""> </span><font class="">let r1 = (E,E,E)</font></div></div><div class=""><div class=""><span style="" class="">λ></span><span style="" class=""> </span><font class="">let r2 = (E,E,E)</font></div></div><div class=""><div class=""><span style="" class="">λ></span><span style="" class=""> </span><font class="">let r3 = (E,E,E)</font></div></div><div class=""><div class=""><font class="">λ> let board = (r1,r2,r3)</font></div></div><div class=""><font color="#999999" class="">((E,E,E),(E,E,E),(E,E,E))</font></div></blockquote><div class=""><font color="#999999" class=""><br class=""></font></div><div class="">To return an updated board, I dug around and <b class=""><i class="">i)</i></b> couldn't find a core Haskell equivalent to Clojure's <a href="http://clojuredocs.org/clojure.core/update-in" class="">update-in</a>. <b class=""><i class="">ii)</i></b> Zippers only deal with trees of left / right nodes. <b class=""><i class="">iii)</i></b> So that left me with <a href="https://github.com/ekmett/lens/wiki/Examples" class="">Control.Lens</a>. Now I can easily inspect and update the board like so. </div></div></div></blockquote><div><br class=""></div>Or you could use an two dimensional array of Positions instead (Data.Array).</div><div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""><br class=""></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><div class=""><div class=""><font color="#999999" class="">λ> board^</font><font class=""><b class=""><i class="">._</i></b><b class=""><i class="">2._1</i></b></font></div></div><div class=""><div class=""><font color="#999999" class="">E</font></div></div><div class=""><div class=""><font color="#999999" class="">λ> set (</font><b class=""><i class="">_2._1</i></b><font color="#999999" class="">) 42 board</font></div></div><div class=""><div class=""><font color="#999999" class="">((E,E,E),(42,E,E),(E,E,E))</font></div></div></blockquote><div class=""><br class=""></div><div class="">I can then parameterize _2 or _1 like so. </div><div class=""><br class=""></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><span style="color:rgb(153,153,153)" class="">λ> </span><span style="color:rgb(153,153,153)" class="">let a = _2<br class=""></span><span style="color:rgb(153,153,153)" class="">λ> </span><span style="color:rgb(153,153,153)" class="">board ^. a</span><div class=""><font color="#999999" class="">(E,E,E)</font></div></blockquote></div></div></blockquote><div><br class=""></div>You can probably find the type of _1, _2, _3 in the repl, and use that in your code below.</div><div><br class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class=""><div class="gmail_extra"><br class=""></div><div class="gmail_extra">But I can't figure out how to include that parameter's type into a <b class=""><i class="">Position</i></b> type definition. I've tried these unsuccessfully. </div><div class="gmail_extra"><br class=""></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><div class=""><div class="gmail_extra"><i class=""><font color="#990000" class="">data Position = Int Int deriving Show  -- original type definition</font></i></div></div><div class=""><div class="gmail_extra"><i class=""><font color="#990000" class="">data Position = Simple Lens (Int a) (Int a) deriving Show  -- failing try 1</font></i></div></div></blockquote></div></div></blockquote><div><br class=""></div>These are very suspicious. Did you intend to define constructors ‘Int’ and ‘Simple’? Maybe you meant something like:</div><div><br class=""></div><div>data Position = Position Int Int deriving Show</div><div><br class=""></div><div>In which case you’ll have a type called ‘Position’ and a constructor with the same name.</div><div><br class=""></div><div>Cheers,</div><div>Bob</div><div><br class=""></div><div><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><div class=""><div class="gmail_extra"><br class=""></div></div><div class=""><div class="gmail_extra">move :: Board -> Piece -> Position -> Board</div></div><div class="gmail_extra">move board piece position = set (position) piece board  -- want to use this instead of "<font color="#999999" class="">set (</font><b class=""><i class="">_2._1</i></b><font color="#999999" class="">) 42 board"</font></div></blockquote><div class=""><div class="gmail_extra"><br class=""></div><div class="gmail_extra"><br class=""></div><div class="gmail_extra">Any ideas? </div><div class="gmail_extra"><br class=""></div><div class="gmail_extra"><br class=""></div><div class="gmail_extra">:) </div><div class="gmail_extra"><br clear="all" class=""><div class=""><div class="gmail_signature"><div dir="ltr" class=""><div style="font-family:arial;font-size:small" class="">Tim Washington </div><div style="font-family:arial;font-size:small" class=""><a href="http://interruptsoftware.com/" style="color:rgb(17,85,204)" target="_blank" class="">Interruptsoftware.com</a> </div></div></div></div>
<div class="gmail_extra"><br class=""></div><br class=""><div class="gmail_quote">On Thu, Mar 12, 2015 at 5:18 PM, Timothy Washington <span dir="ltr" class=""><<a href="mailto:twashing@gmail.com" target="_blank" class="">twashing@gmail.com</a>></span> wrote:<font color="#999999" class=""><br class=""></font><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr" class=""><div class=""><font color="#999999" class="">Veeery nice. Thanks for your insights. </font></div><div class=""><font color="#999999" class=""><br class=""></font></div><div class=""><font color="#999999" class="">The Typeclass stuff making a lot more sense now. And hence ghc-mod's (Interactive-Haskell's) behaviour makes more sense to me. It's working like a charm. </font></div><div class="gmail_extra"><font color="#999999" class=""><br class=""></font></div><div class="gmail_extra"><font color="#999999" class="">I'll play around with nested list manipulation this evening.</font></div><div class="gmail_extra"><font color="#999999" class=""><br class=""></font></div><div class="gmail_extra"><font color="#999999" class=""><br class=""></font></div><div class="gmail_extra"><font color="#999999" class="">Cheers </font></div><div class="gmail_extra"><font color="#999999" class=""><br class=""></font></div><div class="gmail_extra"><div class=""><div class=""><div dir="ltr" class=""><div style="font-family:arial;font-size:small" class=""><font color="#999999" class="">Tim Washington </font></div><div style="font-family:arial;font-size:small" class=""><font color="#999999" class=""><a href="http://interruptsoftware.com/" target="_blank" class="">Interruptsoftware.com</a> </font></div></div></div></div><div class=""><div class="h5">
<div class="gmail_extra"><font color="#999999" class=""><br class=""></font></div><font color="#999999" class=""><br class=""></font><div class="gmail_quote"><font color="#999999" class="">On Thu, Mar 12, 2015 at 8:03 PM, Mike Meyer <span dir="ltr" class=""><<a href="mailto:mwm@mired.org" target="_blank" class="">mwm@mired.org</a>></span> wrote:<br class=""></font><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr" class=""><div class="gmail_extra"><div class="gmail_quote"><span class=""><font color="#999999" class="">On Thu, Mar 12, 2015 at 6:02 PM, Timothy Washington <span dir="ltr" class=""><<a href="mailto:twashing@gmail.com" target="_blank" class="">twashing@gmail.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr" class="">To get started, I'm trying to implement a simple <i class="">tictactoe</i> game. And I would like to be able to represent a Piece on the board, as either the string "X" or "O". This is what I have so far. <div class=""><br class=""></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><div class=""><div class="">module Main where</div></div><div class=""><div class=""><br class=""></div></div><div class=""><div class="">data Piece = X | O</div></div><div class=""><div class="">type Row = [Piece]</div></div><div class=""><div class="">type Board = [Row]</div></div><div class=""><div class=""><br class=""></div></div><div class=""><div class="">-- put an X or O in a position</div></div><div class=""><div class="">move :: Board -> Piece -> Board</div></div><div class=""><div class="">move board piece = board</div></div><div class=""><div class="">  </div></div><div class=""><div class="">-- check win vertically</div></div><div class=""><div class="">-- check win horizontally</div></div><div class=""><div class="">-- check win diagonally</div></div><div class=""><div class=""><br class=""></div></div><div class=""><div class="">main :: IO ()</div></div><div class=""><div class="">main = putStrLn "Hello World"</div></div></blockquote><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><b class=""><i class="">A)</i></b> Now, I'd like to be able to <b class=""><i class="">load code interactively</i></b>, preferably within emacs. However I don't have access to my types with <b class=""><i class="">ghci</i></b> or <b class=""><i class="">ghc-mod (Interactive-Haskell)</i></b>. In either case, this call fails with the below error.</div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px" class=""><div class=""><div class=""><br class=""></div></div><div class=""><div class="">let p = Piece X</div></div><div class=""><div class=""><interactive>:20:9-13: Not in scope: data constructor `Piece'</div></div></blockquote></div></blockquote><div class=""><br class=""></div></font></span><div class=""><font color="#999999" class="">Piece is the data TYPE. It has two constructors, X, and O. If you load your module into ghci, you can do ":t X" to get the type of X, which is Piece. You want to do "let p = X" here.</font></div><div class=""><font color="#999999" class=""><br class=""></font></div><div class=""><font color="#999999" class="">Check your mode docs while editing the haskell file. There should be  a command to load the current buffer into a ghci running in an interactive emacs buffer.</font></div><span class=""><font color="#999999" class=""><div class=""> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr" class=""><div class=""><div class=""><b class=""><i class="">B)</i></b> And how do I make a <b class=""><i class="">custom datatype</i></b> that's one of two strings (enumeration of either "X" or "O"). Cabal builds and runs the abouve code, so I know it can compile. But I'm confused as to where X or O is defined, and how I would supply it as an input. </div></div></div></blockquote><div class=""><br class=""></div><div class=""><br class=""></div></font></span><div class=""><font color="#999999" class="">As noted, you can derive "Show" so that Piece types print as "X" and "O". Similarly, you can derive "Read":</font></div><div class=""><font color="#999999" class=""><br class=""></font></div><div class=""><font color="#999999" class="">data Piece = X | O deriving (Show, Read)</font></div><div class=""><font color="#999999" class=""><br class=""></font></div><div class=""><font color="#999999" class="">so that you can then read "X" and get back an X when the context calls for a Piece value:</font></div><div class=""><p class=""><font color="#999999" class="">*Main> read "X" :: Piece</font></p><p class=""><font color="#999999" class="">X</font></p></div><div class=""><font color="#999999" class=""><br class=""></font></div><div class=""><font color="#999999" class="">However, this isn't used a lot, as it tends to be slow and not very flexible for more complex types. For instance, it will let you read in lists of Pieces and lists of lists, but you'l lhave to use the list syntax,  not something that looks like an actual board when printed.</font></div><div class=""><br class=""></div></div></div></div></blockquote></div></div></div></div></div></blockquote></div></div></div></div>
_______________________________________________<br class="">Beginners mailing list<br class=""><a href="mailto:Beginners@haskell.org" class="">Beginners@haskell.org</a><br class="">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners<br class=""></div></blockquote></div><br class=""></div></body></html>