Send Beginners mailing list submissions to
[email protected]
To subscribe or unsubscribe via the World Wide Web, visit
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
or, via email, send a message with subject or body 'help' to
[email protected]
You can reach the person managing the list at
[email protected]
When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."
Today's Topics:
1. Re: Dipping Toes Into Haskell (Bob Hutchison)
----------------------------------------------------------------------
Message: 1
Date: Mon, 23 Mar 2015 07:57:58 -0400
From: Bob Hutchison <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
beginner-level topics related to Haskell <[email protected]>
Subject: Re: [Haskell-beginners] Dipping Toes Into Haskell
Message-ID: <[email protected]>
Content-Type: text/plain; charset="utf-8"
Hi Tim,
Staying from clojure? :-)
> On Mar 22, 2015, at 12:33 PM, Timothy Washington <[email protected]> wrote:
>
> So I've finally had a chance to revisit my tictactoe game.
>
> import Control.Lens
>
> data Piece = X | O | E deriving Show
> type Row = [Piece]
> type Board = [Row]
> data Position = Int Int deriving Show
>
> -- put an X or O in a position
> move :: Board -> Piece -> Position -> Board
> move board piece position = board
>
> main :: IO ()
> main = putStrLn "Hello World"
>
> -- using Lenses
> -- https://github.com/ekmett/lens/wiki/Examples
> <https://github.com/ekmett/lens/wiki/Examples>
> -- http://lens.github.io/tutorial.html <http://lens.github.io/tutorial.html>
> --
> http://blog.jakubarnold.cz/2014/07/14/lens-tutorial-introduction-part-1.html
> <http://blog.jakubarnold.cz/2014/07/14/lens-tutorial-introduction-part-1.html>
>
> --let r1 = (E,E,E)
> --let r2 = (E,E,E)
> --let r3 = (E,E,E)
> --let board = (r1,r2,r3)
>
> Now, if I want to make a move, I'll want to set a piece on a position, on a
> board. Let's assume the board has the following shape.
>
> ?> let r1 = (E,E,E)
> ?> let r2 = (E,E,E)
> ?> let r3 = (E,E,E)
> ?> let board = (r1,r2,r3)
> ((E,E,E),(E,E,E),(E,E,E))
>
> To return an updated board, I dug around and i) couldn't find a core Haskell
> equivalent to Clojure's update-in
> <http://clojuredocs.org/clojure.core/update-in>. ii) Zippers only deal with
> trees of left / right nodes. iii) So that left me with Control.Lens
> <https://github.com/ekmett/lens/wiki/Examples>. Now I can easily inspect and
> update the board like so.
Or you could use an two dimensional array of Positions instead (Data.Array).
>
> ?> board^._2._1
> E
> ?> set (_2._1) 42 board
> ((E,E,E),(42,E,E),(E,E,E))
>
> I can then parameterize _2 or _1 like so.
>
> ?> let a = _2
> ?> board ^. a
> (E,E,E)
You can probably find the type of _1, _2, _3 in the repl, and use that in your
code below.
>
> But I can't figure out how to include that parameter's type into a Position
> type definition. I've tried these unsuccessfully.
>
> data Position = Int Int deriving Show -- original type definition
> data Position = Simple Lens (Int a) (Int a) deriving Show -- failing try 1
These are very suspicious. Did you intend to define constructors ?Int? and
?Simple?? Maybe you meant something like:
data Position = Position Int Int deriving Show
In which case you?ll have a type called ?Position? and a constructor with the
same name.
Cheers,
Bob
>
> move :: Board -> Piece -> Position -> Board
> move board piece position = set (position) piece board -- want to use this
> instead of "set (_2._1) 42 board"
>
>
> Any ideas?
>
>
> :)
>
> Tim Washington
> Interruptsoftware.com <http://interruptsoftware.com/>
>
>
> On Thu, Mar 12, 2015 at 5:18 PM, Timothy Washington <[email protected]
> <mailto:[email protected]>> wrote:
> Veeery nice. Thanks for your insights.
>
> 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.
>
> I'll play around with nested list manipulation this evening.
>
>
> Cheers
>
> Tim Washington
> Interruptsoftware.com <http://interruptsoftware.com/>
>
>
> On Thu, Mar 12, 2015 at 8:03 PM, Mike Meyer <[email protected]
> <mailto:[email protected]>> wrote:
> On Thu, Mar 12, 2015 at 6:02 PM, Timothy Washington <[email protected]
> <mailto:[email protected]>> wrote:
> To get started, I'm trying to implement a simple tictactoe 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.
>
> module Main where
>
> data Piece = X | O
> type Row = [Piece]
> type Board = [Row]
>
> -- put an X or O in a position
> move :: Board -> Piece -> Board
> move board piece = board
>
> -- check win vertically
> -- check win horizontally
> -- check win diagonally
>
> main :: IO ()
> main = putStrLn "Hello World"
>
>
> A) Now, I'd like to be able to load code interactively, preferably within
> emacs. However I don't have access to my types with ghci or ghc-mod
> (Interactive-Haskell). In either case, this call fails with the below error.
>
> let p = Piece X
> <interactive>:20:9-13: Not in scope: data constructor `Piece'
>
> 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.
>
> 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.
>
> B) And how do I make a custom datatype 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.
>
>
> As noted, you can derive "Show" so that Piece types print as "X" and "O".
> Similarly, you can derive "Read":
>
> data Piece = X | O deriving (Show, Read)
>
> so that you can then read "X" and get back an X when the context calls for a
> Piece value:
> *Main> read "X" :: Piece
>
> X
>
>
> 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.
>
> _______________________________________________
> Beginners mailing list
> [email protected]
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
-------------- next part --------------
An HTML attachment was scrubbed...
URL:
<http://mail.haskell.org/pipermail/beginners/attachments/20150323/1a995bb2/attachment-0001.html>
------------------------------
Subject: Digest Footer
_______________________________________________
Beginners mailing list
[email protected]
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
------------------------------
End of Beginners Digest, Vol 81, Issue 54
*****************************************