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.  Dipping Toes Into Haskell (Timothy Washington)
   2. Re:  Dipping Toes Into Haskell
      (Sumit Sahrawat, Maths & Computing, IIT (BHU))
   3. Re:  Dipping Toes Into Haskell (Kim-Ee Yeoh)
   4. Re:  Dipping Toes Into Haskell (Mike Meyer)


----------------------------------------------------------------------

Message: 1
Date: Thu, 12 Mar 2015 19:02:12 -0400
From: Timothy Washington <[email protected]>
To: [email protected]
Subject: [Haskell-beginners] Dipping Toes Into Haskell
Message-ID:
        <CAADtM-b4=WpP+pn0KbgRN=6xv-3y2axh3osjs81yvgvg+7e...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

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>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://mail.haskell.org/pipermail/beginners/attachments/20150312/c3abf51b/attachment-0001.html>

------------------------------

Message: 2
Date: Fri, 13 Mar 2015 05:20:16 +0530
From: "Sumit Sahrawat, Maths & Computing, IIT (BHU)"
        <[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:
        <CAJbEW8PXy=VsQpxE0H=g5v1szc4qn8xfdcyqvtienadihfn...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

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 <[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'
>
>
> *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
> [email protected]
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>


-- 
Regards

Sumit Sahrawat
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://mail.haskell.org/pipermail/beginners/attachments/20150313/d2e40668/attachment-0001.html>

------------------------------

Message: 3
Date: Fri, 13 Mar 2015 06:53:55 +0700
From: Kim-Ee Yeoh <[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:
        <capy+zdqt4k8v5z9urzvqvjodslulvz0_3ypkbkkrnfquwc_...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

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 <[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'
>
>
> *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
> [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/20150313/1b836cfb/attachment-0001.html>

------------------------------

Message: 4
Date: Thu, 12 Mar 2015 19:03:51 -0500
From: Mike Meyer <[email protected]>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <[email protected]>,
        [email protected]
Subject: Re: [Haskell-beginners] Dipping Toes Into Haskell
Message-ID:
        <CAD=7u2dfk_t9z+iws9s1qtqyzz+yringyeboecv0pj3gvmw...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

On Thu, Mar 12, 2015 at 6:02 PM, Timothy Washington <[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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://mail.haskell.org/pipermail/beginners/attachments/20150312/6e56f34c/attachment.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 39
*****************************************

Reply via email to