Hi Jason,
To help me understand your question, would you be unhappy with the following structure?
-- runnable
main = interact f
-- composable
f = ...
The discipline is to use interact (or another combinator) to wrap a functional/composable/pure component like f into an executable. Then give main to users and f to programmers. This same game can be made more sophisticated, eg
main = interact (show . f . read)
Or unparse & parse in place of show & read.
For more on combining usability and composability, see
http://haskell.org/haskellwiki/TV
http://conal.net/blog/posts/tangible-functional-programming-a-modern-marriage-of-usability-and-composability/
- Conal
Informally, a "pure program" an executable such that the
stream of bytes entering it totally determines the stream of
bytes leaving it.
Many useful programs that I would like to write in Haskell
don't fall into this category -- for example, network servers
-- but a lot of their components do. Can these components can
be Haskell functions without IO in their signatures?
Though that seems reasonable, it is not, in general, true. For
example, System.Info.os is generally treated as pure,
though it is not. It's not clear to me how to disambiguate
these "born again" values from really pure values.
--
_jsn
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe