Send Beginners mailing list submissions to
        beginners@haskell.org

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
        beginners-requ...@haskell.org

You can reach the person managing the list at
        beginners-ow...@haskell.org

When replying, please edit your Subject line so it is more specific
than "Re: Contents of Beginners digest..."


Today's Topics:

   1. Re:  Noobie attempt to process log output into dependency
      graph (John Lusk)
   2. Re:  Noobie attempt to process log output into dependency
      graph (Imants Cekusins)
   3. Re:  Noobie attempt to process log output into    dependency
      graph (Magnus Therning)
   4. Re:  Noobie attempt to process log output into dependency
      graph (John Lusk)


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

Message: 1
Date: Thu, 15 Dec 2016 08:44:08 -0500
From: John Lusk <john-hask...@how-hard-can-it-be.com>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <beginners@haskell.org>
Subject: Re: [Haskell-beginners] Noobie attempt to process log output
        into dependency graph
Message-ID:
        <CAJQkMbYKtjMRTPRWJpn7qnRHy-XavHXoFad0=svyxmo6nvf...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

I have not, but I might. This was a little work project that I've now run
out of time for.

I was really hoping for a deeper discussion of state management than "just
use this package." This seems kind of like receiving a stream of inputs
from a user and needing to keep track of several items of state that are
changing independently (as opposed to the neat problems usually used in
basic FP education).

Should I be taking a more monadic approach?

On Thu, Dec 15, 2016 at 5:17 AM, Magnus Therning <mag...@therning.org>
wrote:

>
> John Lusk <johnlu...@gmail.com> writes:
>
> > Hi, all,
> [.. cut ..]
> > http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
> If I understand you correctly you want to parse a set of lines and keep
> track of indentation. This is not entirely unlike parsing a programming
> language where indentation is significant, like Haskell :) Is that
> correct?
>
> A quick look at Hackage gives several libs with combinators dealing with
> indentaion-aware parsers. Have you looked at any of them?
>
> /M
>
> --
> Magnus Therning              OpenPGP: 0x927912051716CE39
> email: mag...@therning.org   jabber: mag...@therning.org
> twitter: magthe               http://therning.org/magnus
>
> For a successful technology, reality must take precedence over public
> relations, for nature cannot be fooled.
>      — R.P. Feynman
>
> _______________________________________________
> Beginners mailing list
> Beginners@haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://mail.haskell.org/pipermail/beginners/attachments/20161215/d7b257bb/attachment-0001.html>

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

Message: 2
Date: Thu, 15 Dec 2016 16:18:37 +0100
From: Imants Cekusins <ima...@gmail.com>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <beginners@haskell.org>
Subject: Re: [Haskell-beginners] Noobie attempt to process log output
        into dependency graph
Message-ID:
        <CAP1qinYS2Q73kM0-W-aEEHNvPYXS=4c3ajvgqv2fnr24ago...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

>  https://github.com/JohnL4/DependencyGraph

A graph library of your choice + State monad would do the trick.
e.g.:  fgl Data-Graph-Inductive-Monad
<https://hackage.haskell.org/package/fgl-5.5.3.0/docs/Data-Graph-Inductive-Monad.html>


Or you could store Graph state in an MVar and work as you would with
stateful approach
​
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://mail.haskell.org/pipermail/beginners/attachments/20161215/3c53a00f/attachment-0001.html>

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

Message: 3
Date: Thu, 15 Dec 2016 20:38:37 +0100
From: Magnus Therning <mag...@therning.org>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <beginners@haskell.org>
Subject: Re: [Haskell-beginners] Noobie attempt to process log output
        into    dependency graph
Message-ID: <871sx9c79e....@therning.org>
Content-Type: text/plain; charset="utf-8"


John Lusk <john-hask...@how-hard-can-it-be.com> writes:

> I have not, but I might. This was a little work project that I've now run
> out of time for.
>
> I was really hoping for a deeper discussion of state management than
> "just use this package." This seems kind of like receiving a stream of
> inputs from a user and needing to keep track of several items of state
> that are changing independently (as opposed to the neat problems
> usually used in basic FP education).
>
> Should I be taking a more monadic approach?

Well, we have to start somewhere :)

Anyway, you don't necessarily have to resort to the state monad. I
believe, based you your other code that you quite easily can go from
your list of lines to a list of `(Int, String)`, where the integer
indicates the indentation level. Then you can look at `Data.Tree` (in
containers) and `Data.Tree.Zipper` (in rosezipper) to build your tree.

This is my quick hack:

~~~
buildTree _ zipPos [] = zipPos
buildTree n zipPos xx@((lvl, s):xs)
  | lvl > n =
    let newZipPos = children zipPos
        node = Node s []
    in buildTree lvl (insert node newZipPos) xs
  | lvl == n =
    let newZipPos = nextSpace zipPos
        node = Node s []
    in buildTree lvl (insert node newZipPos) xs
  | lvl < n =
    let (Just newZipPos) = parent zipPos
    in buildTree (n - 1) newZipPos xx
~~~

With the following definitions in place:

~~~
ils = [ (1, "The root")
      , (2, "Child 1")
      , (3, "Child 1.1")
      , (4, "Child 1.1.1")
      , (3, "Child 1.2")
      , (2, "Child 2")
      ]

zipRoot = fromTree $ Node "absolute top" []
~~~

I build the tree, and print it, like this:

~~~
putStrLn $ drawTree $ toTree $ buildTree 0 zipRoot ils
top
|
`- The root
   |
   +- Child 1
   |  |
   |  +- Child 1.1
   |  |  |
   |  |  `- Child 1.1.1
   |  |
   |  `- Child 1.2
   |
   `- Child 2
~~~

Whether this is usable for you depends a lot on how big your logs are, I
suppose.

If this was something that I'd keep around for a while I'd probably
look into rewriting `buildTree` so that it would fit for use with
`mapAccumL`.

/M

--
Magnus Therning              OpenPGP: 0x927912051716CE39
email: mag...@therning.org   jabber: mag...@therning.org
twitter: magthe               http://therning.org/magnus

The British have "the perfect temperament to be hackers—technically
skilled, slightly disrespectful of authority, and just a touch of
criminal behavior".
     — Mary Ann Davidson, Oracle's Security Chief
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 832 bytes
Desc: not available
URL: 
<http://mail.haskell.org/pipermail/beginners/attachments/20161215/9a653ef6/attachment-0001.sig>

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

Message: 4
Date: Thu, 15 Dec 2016 16:09:49 -0500
From: John Lusk <john-hask...@how-hard-can-it-be.com>
To: The Haskell-Beginners Mailing List - Discussion of primarily
        beginner-level topics related to Haskell <beginners@haskell.org>
Subject: Re: [Haskell-beginners] Noobie attempt to process log output
        into dependency graph
Message-ID:
        <CAJQkMbYdWNgRe=x46LqXZ0oFZ9BkzaaqpvQqhvcryW=q2ms...@mail.gmail.com>
Content-Type: text/plain; charset="utf-8"

Thanks, all, that gives me something to chew on.

It occurred to me (during my 45-minute commute to work) that all Haskell
programs (listen to the noob <eyeroll/>) have the following structure
(modulo my fractured syntax):

main :: IO()
main = do
  inputs <- getInputs
  doOutput $ f inputs initialState

f :: [input] -> state -> outputs

f [] state =
  transformToOutputs state

f (input:inputs) state =
  f inputs (newState state input)

doOutput :: [output] -> IO()

doOutput outputs = do
  putStr $ unlines outputs

So all I have to do is write newState and I'm good! ^_^

(transformToOutputs will, of course, be a snap.)

Right?

John.

On Thu, Dec 15, 2016 at 2:38 PM, Magnus Therning <mag...@therning.org>
wrote:

>
> John Lusk <john-hask...@how-hard-can-it-be.com> writes:
>
> > I have not, but I might. This was a little work project that I've now run
> > out of time for.
> >
> > I was really hoping for a deeper discussion of state management than
> > "just use this package." This seems kind of like receiving a stream of
> > inputs from a user and needing to keep track of several items of state
> > that are changing independently (as opposed to the neat problems
> > usually used in basic FP education).
> >
> > Should I be taking a more monadic approach?
>
> Well, we have to start somewhere :)
>
> Anyway, you don't necessarily have to resort to the state monad. I
> believe, based you your other code that you quite easily can go from
> your list of lines to a list of `(Int, String)`, where the integer
> indicates the indentation level. Then you can look at `Data.Tree` (in
> containers) and `Data.Tree.Zipper` (in rosezipper) to build your tree.
>
> This is my quick hack:
>
> ~~~
> buildTree _ zipPos [] = zipPos
> buildTree n zipPos xx@((lvl, s):xs)
>   | lvl > n =
>     let newZipPos = children zipPos
>         node = Node s []
>     in buildTree lvl (insert node newZipPos) xs
>   | lvl == n =
>     let newZipPos = nextSpace zipPos
>         node = Node s []
>     in buildTree lvl (insert node newZipPos) xs
>   | lvl < n =
>     let (Just newZipPos) = parent zipPos
>     in buildTree (n - 1) newZipPos xx
> ~~~
>
> With the following definitions in place:
>
> ~~~
> ils = [ (1, "The root")
>       , (2, "Child 1")
>       , (3, "Child 1.1")
>       , (4, "Child 1.1.1")
>       , (3, "Child 1.2")
>       , (2, "Child 2")
>       ]
>
> zipRoot = fromTree $ Node "absolute top" []
> ~~~
>
> I build the tree, and print it, like this:
>
> ~~~
> putStrLn $ drawTree $ toTree $ buildTree 0 zipRoot ils
> top
> |
> `- The root
>    |
>    +- Child 1
>    |  |
>    |  +- Child 1.1
>    |  |  |
>    |  |  `- Child 1.1.1
>    |  |
>    |  `- Child 1.2
>    |
>    `- Child 2
> ~~~
>
> Whether this is usable for you depends a lot on how big your logs are, I
> suppose.
>
> If this was something that I'd keep around for a while I'd probably
> look into rewriting `buildTree` so that it would fit for use with
> `mapAccumL`.
>
> /M
>
> --
> Magnus Therning              OpenPGP: 0x927912051716CE39
> email: mag...@therning.org   jabber: mag...@therning.org
> twitter: magthe               http://therning.org/magnus
>
> The British have "the perfect temperament to be hackers—technically
> skilled, slightly disrespectful of authority, and just a touch of
> criminal behavior".
>      — Mary Ann Davidson, Oracle's Security Chief
>
> _______________________________________________
> Beginners mailing list
> Beginners@haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: 
<http://mail.haskell.org/pipermail/beginners/attachments/20161215/0d9a5275/attachment.html>

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

Subject: Digest Footer

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners


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

End of Beginners Digest, Vol 102, Issue 8
*****************************************

Reply via email to