# [Haskell-cafe] "Wrong kind" when attempting to build a monad for a circular list of functions

Bas van Dijk v.dijk.bas at gmail.com
Thu Feb 28 04:38:37 EST 2008

```On Thu, Feb 28, 2008 at 8:28 AM, Aaron Altman <aaltman at pdx.edu> wrote:
>  I am working on an AI agent that will perform a finite series of actions
>  before starting the sequence over again.  I figured a circular list of
>  functions that shifts as you apply them would be the way to do it...

I think a better representation of "a finite series of actions" is a
'Monad m => [m a]' because your AI agent will likely do some side
effects when it's executing. Then if you also want to thread some
state through the actions you should have a 'Monad m => [a -> m a]':
(Another idea is to use MonadState)

import Control.Monad

walk :: (Monad m) => [a -> m a] -> a -> m a
walk = foldr (>=>) return

always :: (Monad m) => (a -> m a) -> a -> m b
always f z = f z >>= always f

ai :: (Monad m) => a -> [a -> m a] -> m a
ai z f = always (walk f) z

example = ai 0 [ \x -> print x >> return x
, \x -> if x > 10
then fail "the end"
else return (x+1)
]

regards,

Bas
```

More information about the Haskell-Cafe mailing list