
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' *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. *C)* Finally, how do we update nested lists in Haskell. I want the move function to take a Board, Piece, and Position, and return a Board. I see some results from Hoogle https://www.haskell.org/hoogle/?hoogle=update. Is this where Lenses https://www.haskell.org/hoogle/?hoogle=lens or Zippers https://www.haskell.org/hoogle/?hoogle=zipper come into play? Thanks Tim Washington Interruptsoftware.com http://interruptsoftware.com

data Piece = X | O
means that X and O are constants, having data type 'Piece'.
In other words, you directly use X and O instead of Piece X and Piece O.
Piece is a type, and X and O are constructors (or simply the two possible
values).
A good similar example is the Bool type,
data Bool = False | True
-- Two possible values, i.e. False and True
For more info, take a look here:
http://en.wikibooks.org/wiki/Haskell/Type_declarations
Also, to make life easier, you might want to use:
data Piece = X | O
deriving Show -- Make this type showable
With this, you will be able to use 'print' with elements of this datatype.
For a tutorial on setting up emacs, take a look here:
https://github.com/serras/emacs-haskell-tutorial/blob/master/tutorial.md
For updating nested lists, you have to create a function that takes two
numbers (the positions) and iterates over the whole structure, just
updating the required position.
While this may seem like an overkill, it gets optimized by ghc.
I don't have any experience with lenses, but they should be usable here.
Understanding them will require a good understanding of the type system.
On 13 March 2015 at 04:32, Timothy Washington
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'
*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.
*C)* Finally, how do we update nested lists in Haskell. I want the move function to take a Board, Piece, and Position, and return a Board. I see some results from Hoogle https://www.haskell.org/hoogle/?hoogle=update. Is this where Lenses https://www.haskell.org/hoogle/?hoogle=lens or Zippers https://www.haskell.org/hoogle/?hoogle=zipper come into play?
Thanks
Tim Washington Interruptsoftware.com http://interruptsoftware.com
_______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
-- Regards Sumit Sahrawat

Good explanation. Thank-you.
Tim Washington
Interruptsoftware.com http://interruptsoftware.com
On Thu, Mar 12, 2015 at 7:50 PM, Sumit Sahrawat, Maths & Computing, IIT
(BHU)
data Piece = X | O
means that X and O are constants, having data type 'Piece'. In other words, you directly use X and O instead of Piece X and Piece O.
Piece is a type, and X and O are constructors (or simply the two possible values).
A good similar example is the Bool type,
data Bool = False | True -- Two possible values, i.e. False and True
For more info, take a look here: http://en.wikibooks.org/wiki/Haskell/Type_declarations
Also, to make life easier, you might want to use:
data Piece = X | O deriving Show -- Make this type showable
With this, you will be able to use 'print' with elements of this datatype.
For a tutorial on setting up emacs, take a look here: https://github.com/serras/emacs-haskell-tutorial/blob/master/tutorial.md
For updating nested lists, you have to create a function that takes two numbers (the positions) and iterates over the whole structure, just updating the required position. While this may seem like an overkill, it gets optimized by ghc.
I don't have any experience with lenses, but they should be usable here. Understanding them will require a good understanding of the type system.
On 13 March 2015 at 04:32, Timothy Washington
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'
*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.
*C)* Finally, how do we update nested lists in Haskell. I want the move function to take a Board, Piece, and Position, and return a Board. I see some results from Hoogle https://www.haskell.org/hoogle/?hoogle=update. Is this where Lenses https://www.haskell.org/hoogle/?hoogle=lens or Zippers https://www.haskell.org/hoogle/?hoogle=zipper come into play?
Thanks
Tim Washington Interruptsoftware.com http://interruptsoftware.com
_______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
-- Regards
Sumit Sahrawat
_______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners

Hi Tim,
Congrats on your choice of tic-tac-toe. I also believe it's a good toy to
get your feet wet with haskell.
1. Your concerns about writing a "custom datatype" are best addressed by
reading up on it. If you search for "haskell data type declarations",
you'll find good material explaining the difference between "data",
"newtype", and "type" declarations. You'll also understand the meaning of
the error message and what "data constructor" refers to.
2. Functions defined on lists are here:
https://hackage.haskell.org/package/base/docs/Data-List.html
The update function you're looking for is (!!).
-- Kim-Ee
On Fri, Mar 13, 2015 at 6:02 AM, Timothy Washington
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'
*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.
*C)* Finally, how do we update nested lists in Haskell. I want the move function to take a Board, Piece, and Position, and return a Board. I see some results from Hoogle https://www.haskell.org/hoogle/?hoogle=update. Is this where Lenses https://www.haskell.org/hoogle/?hoogle=lens or Zippers https://www.haskell.org/hoogle/?hoogle=zipper come into play?
Thanks
Tim Washington Interruptsoftware.com http://interruptsoftware.com
_______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners

Thank-you :) And thanks for the Data.List docs. That's a good place to
start.
Tim Washington
Interruptsoftware.com http://interruptsoftware.com
On Thu, Mar 12, 2015 at 7:53 PM, Kim-Ee Yeoh
Hi Tim,
Congrats on your choice of tic-tac-toe. I also believe it's a good toy to get your feet wet with haskell.
1. Your concerns about writing a "custom datatype" are best addressed by reading up on it. If you search for "haskell data type declarations", you'll find good material explaining the difference between "data", "newtype", and "type" declarations. You'll also understand the meaning of the error message and what "data constructor" refers to.
2. Functions defined on lists are here:
https://hackage.haskell.org/package/base/docs/Data-List.html
The update function you're looking for is (!!).
-- Kim-Ee
On Fri, Mar 13, 2015 at 6:02 AM, Timothy Washington
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'
*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.
*C)* Finally, how do we update nested lists in Haskell. I want the move function to take a Board, Piece, and Position, and return a Board. I see some results from Hoogle https://www.haskell.org/hoogle/?hoogle=update. Is this where Lenses https://www.haskell.org/hoogle/?hoogle=lens or Zippers https://www.haskell.org/hoogle/?hoogle=zipper come into play?
Thanks
Tim Washington Interruptsoftware.com http://interruptsoftware.com
_______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
_______________________________________________ Beginners mailing list Beginners@haskell.org http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners

On Thu, Mar 12, 2015 at 6:02 PM, Timothy Washington
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.
participants (4)
-
Kim-Ee Yeoh
-
Mike Meyer
-
Sumit Sahrawat, Maths & Computing, IIT (BHU)
-
Timothy Washington