Re: [Haskell-cafe] Combining State and List Monads

2012-08-25 Thread Edward Z. Yang
Ah, egg in my face, I appear to have misremembered how ListT is implemented ^_^
http://www.haskell.org/haskellwiki/ListT_done_right may be relevant.

Edward

Excerpts from Edward Z. Yang's message of Sat Aug 25 01:51:40 -0400 2012:
 Hello Henry,
 
 In such cases, it is often worth thinking about how you would implement
 such a scheme manually, without using pre-existing monads.  You will
 quickly see that the two candidate types:
 
 s - ([a], s)
 [s - (a, s)]
 
 both will not work (exercise: what semantics do they give?)  In fact,
 you must use continuation passing style, and you must resume the
 computation with the latest state value you would extracted from the
 last run.  See the LogicT monad for how to implement list-like monads in
 continuation passing style.
 
 Cheers,
 Edward
 
 Excerpts from Henry Laxen's message of Sat Aug 25 00:35:37 -0400 2012:
  Dear Cafe,
  
  It seems to me there should be some simple way of doing this, but thus
  far it eludes me.  I am trying to combine the State and List monads to
  do the following:
  
  countCalls = do
a - [1..2]
b - [1..2]
modify (+1)
return (a,b)
  
  
  where with some combination of ListT, StateT, List, State, or who
  knows what would result in:
  
  ([(1,1),(1,2),(2,1),(2,2)],4)
  
  assuming we initialize the state to 0
  
  Is there any way to make this happen?
  Thanks in advance.
  
  Henry Laxen
  

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] Combining State and List Monads

2012-08-24 Thread Henry Laxen
Dear Cafe,

It seems to me there should be some simple way of doing this, but thus
far it eludes me.  I am trying to combine the State and List monads to
do the following:

countCalls = do
  a - [1..2]
  b - [1..2]
  modify (+1)
  return (a,b)


where with some combination of ListT, StateT, List, State, or who
knows what would result in:

([(1,1),(1,2),(2,1),(2,2)],4)

assuming we initialize the state to 0

Is there any way to make this happen?
Thanks in advance.

Henry Laxen



___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Combining State and List Monads

2012-08-24 Thread Paolino
Hello,

the state should be inside, to count, so type is ListT (State Int) (Int,Int)

the runner is then runState (runListT countCalls) 0

but [] is not of type ListT m so you need to wrap it in ListT . return

import Control.Monad.List
import Control.Monad.State
import Control.Monad.Instances

countCalls :: ListT (State Int) (Int,Int)
countCalls = do
  a - ListT . return $ [1..2]
  b - ListT . return $ [1..2]
  modify (+1)
  return (a,b)

regards

paolino

2012/8/25 Henry Laxen nadine.and.he...@pobox.com

 Dear Cafe,

 It seems to me there should be some simple way of doing this, but thus
 far it eludes me.  I am trying to combine the State and List monads to
 do the following:

 countCalls = do
   a - [1..2]
   b - [1..2]
   modify (+1)
   return (a,b)


 where with some combination of ListT, StateT, List, State, or who
 knows what would result in:

 ([(1,1),(1,2),(2,1),(2,2)],4)

 assuming we initialize the state to 0

 Is there any way to make this happen?
 Thanks in advance.

 Henry Laxen



 ___
 Haskell-Cafe mailing list
 Haskell-Cafe@haskell.org
 http://www.haskell.org/mailman/listinfo/haskell-cafe

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Combining State and List Monads

2012-08-24 Thread Edward Z. Yang
Hello Henry,

In such cases, it is often worth thinking about how you would implement
such a scheme manually, without using pre-existing monads.  You will
quickly see that the two candidate types:

s - ([a], s)
[s - (a, s)]

both will not work (exercise: what semantics do they give?)  In fact,
you must use continuation passing style, and you must resume the
computation with the latest state value you would extracted from the
last run.  See the LogicT monad for how to implement list-like monads in
continuation passing style.

Cheers,
Edward

Excerpts from Henry Laxen's message of Sat Aug 25 00:35:37 -0400 2012:
 Dear Cafe,
 
 It seems to me there should be some simple way of doing this, but thus
 far it eludes me.  I am trying to combine the State and List monads to
 do the following:
 
 countCalls = do
   a - [1..2]
   b - [1..2]
   modify (+1)
   return (a,b)
 
 
 where with some combination of ListT, StateT, List, State, or who
 knows what would result in:
 
 ([(1,1),(1,2),(2,1),(2,2)],4)
 
 assuming we initialize the state to 0
 
 Is there any way to make this happen?
 Thanks in advance.
 
 Henry Laxen
 

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe