On 5 Dec 2008, at 16:42, Apfelmus, Heinrich wrote:

Thomas Davie wrote:
You don't even need a type class, a simple data type is enough.

Very true, but I disagree that you've made it functional in any way, IO
is all about sequencing things, it's very much not a functional style

data Engine = Engine { foo :: IO (), bar :: String -> IO () }

This is much nicer done as functions from String -> String

Sure, I agree. I was just replicating  foo  and  bar  from the OP
because I don't know what kind of effect he had in mind. I mean, instead of merely mapping each command in isolation, he could want to accumulate
a value or read files or something.

Sure, and he could then use a fold instead of a map. Reading files is problematic, but as long as you're only doing it once (the most common situation) is entirely fine wrapped up in an unsafePerformIO.

Either way, the question was how to do it functionally, and to do it functionally, and with all of the nice shiny benefits we get with functional code like composibility and orthogonality, you need to do it with String -> String.

Bob

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

Reply via email to