Personal tools

The Other Prelude

From HaskellWiki

(Difference between revisions)
Jump to: navigation, search
(String class?)
(if-then-else and Utilities)
Line 16: Line 16:
 
Although, not Haskell 98, hierarchical modules will definitely be in Haskell'. We take it for granted.
 
Although, not Haskell 98, hierarchical modules will definitely be in Haskell'. We take it for granted.
 
* <hask>TheOtherPrelude</hask> - Minimalistic module.
 
* <hask>TheOtherPrelude</hask> - Minimalistic module.
* <hask>TheOtherPrelude.Extension</hask> - Convenient definitions.
+
* <hask>TheOtherPrelude.Utilities</hask> - Convenient definitions. The reasoning behind its existence is that we want the Prelude to be very concise. It should not steal good names.
   
 
== Open Issues ==
 
== Open Issues ==
Line 26: Line 26:
   
 
The imaginery Prelude as it stands,
 
The imaginery Prelude as it stands,
+
=== <hask>TheOtherPrelude</hask> ===
 
<haskell>
 
<haskell>
  +
-- module: TheOtherPrelude
 
import Prelude () -- hide everything
 
import Prelude () -- hide everything
   
Line 95: Line 96:
 
</haskell>
 
</haskell>
   
  +
=== <hask>TheOtherPrelude.Utilities</hask> ===
  +
<haskell>
  +
-- module: TheOtherPrelude.Utilities
  +
  +
import Prelude () -- hide everything
  +
  +
-- this is the if-then-else proposal
  +
-- the name has been chosen to reflect the magic of Church booleans!
  +
boolean True x _ = x
  +
boolean False _ y = x
  +
  +
</haskell>
 
== How To Use ==
 
== How To Use ==
 
<haskell>
 
<haskell>
Line 113: Line 126:
 
* [[Prelude extensions]] and [[Prelude function suggestions]] - Unlike ''The Other Prelude'' they ''enhance'' the Prelude.
 
* [[Prelude extensions]] and [[Prelude function suggestions]] - Unlike ''The Other Prelude'' they ''enhance'' the Prelude.
 
* [[Functor hierarchy proposal]] - Making <hask>Monad m</hask> imply <hask>Functor m</hask> (adopted by ''The Other Prelude'').
 
* [[Functor hierarchy proposal]] - Making <hask>Monad m</hask> imply <hask>Functor m</hask> (adopted by ''The Other Prelude'').
* [[If-then-else]] - Making <hask>if</hask> a function.
+
* [[If-then-else]] - Making <hask>if</hask> a function (partially adopted by ''The Other Prelude'', we are silent on the bigger issue of sugar).
 
* [http://software.complete.org/missingh/static/doc/ MissingH] - Functions "missing" from the Haskell Prelude/libraries.
 
* [http://software.complete.org/missingh/static/doc/ MissingH] - Functions "missing" from the Haskell Prelude/libraries.
 
* [[MonadPlus reform proposal]] - Clarifies ambiguities around MonadPlus laws (adopted by ''The Other Prelude'')
 
* [[MonadPlus reform proposal]] - Clarifies ambiguities around MonadPlus laws (adopted by ''The Other Prelude'')

Revision as of 06:15, 30 December 2006


Contents

1 Call For Contribution

This fun project, called The Other Prelude, is a creative reconstruction of the standard Prelude. By disregarding history and compatibility, we get a clean sheet.

2 Committee

This project has no committee whatsoever. Haskell community discussed the issues here.

3 Naming Conventions

  • Function names should be easy for beginners to consume.
  • Specifically, The Other Prelude naming convention is to use
    • descriptive symbols for functions that are naturally infix (e.g.,
      mplus
      is replaced by
      (++)
      )
    • whole English words and camelCase for functions (e.g.,
      orElse
      but not
      fmap
      )

4 The Hierarchy

Although, not Haskell 98, hierarchical modules will definitely be in Haskell'. We take it for granted.

  • TheOtherPrelude
    - Minimalistic module.
  • TheOtherPrelude.Utilities
    - Convenient definitions. The reasoning behind its existence is that we want the Prelude to be very concise. It should not steal good names.

5 Open Issues

  • Should Prelude functions use
    Integer
    instead of
    Int
    ?
  • Should
    String
    be a class rather than a type synonym?

6 The Code

Currently, the code is in Wiki form. If people do agree that the collaborative decisions begot something pretty, we'll have a group of files in darcs.haskell.org some time.

The imaginery Prelude as it stands,

6.1
TheOtherPrelude

-- module: TheOtherPrelude
import Prelude ()    -- hide everything
 
-- the idea is to remove 'fmap'.
-- both map :: (a -> b) -> [a] -> [b] ('fmap' for the monad []) 
-- and (.) :: (a -> b) -> (e -> a) -> (e -> b) ('fmap' for the (->) e monad)
-- are good names, and are intuitively prefix and infix respectively.
class Functor f where
  -- 'fmap' is guilty of nothing but a bad name
  map, (.) :: (a -> b) -> f a -> f b
 
  -- implementing either is enough
  map = (.)
  (.) = map
 
-- the following has been shamelessly copied,
-- from the [[Functor hierarchy proposal]] wiki page.
class Functor f => Applicative f where
  -- lifting a value
  return :: a -> f a
 
  -- should this be named 'ap'? is 'ap' a good name?
  -- can you come up with a better name?
  -- can it refactor the liftM* type gymnastics?
  (<*>) :: f (a -> b) -> f a -> f b   
 
-- this leaves little left for the actual Monad class
class (Applicative m) => Monad m where
  -- the binding operation, gist of a monad 
  (>>=) :: m a -> (a -> m b) -> m b
 
  -- throwing out the outer monad
  join :: m (m a) -> m a
 
  -- when the second is independent of the first
  -- included in the class in case performance can be enhanced
  (>>) :: m a -> m b -> m b
 
  -- intuitive definitions
  fa >> fb = (map (const id) fa) <*> fb    -- is there a better definition?
  x >>= f = join (map f x)
  join x = x >>= id
 
-- we shamelessly copy from the [[MonadPlus reform proposal]] now.
 
-- zero will be used when pattern matching against refutable patterns in
-- do-notation as well as to provide support for monad comprehensions.
 
-- should satisfy 'left zero': zero >>= f = zero
class (Monad m) => MonadZero m where
  zero :: m a
 
-- should satisfy 'monoid' 
-- zero ++ b = b, b ++ zero = b, (a ++ b) ++ c = a ++ (b ++ c)
-- and 'left distribution'
-- (a ++ b) >>= f = (a >>= f) ++ (b >>= f)
class (MonadZero m) => MonadPlus m where
  (++) :: m a -> m a -> m a
 
-- should satisfy 'monoid' 
-- zero `orElse` b = b, b `orElse` zero = b
-- (a `orElse` b) `orElse` c = a `orElse` (b `orElse` c)
-- and 'left catch'
-- (return a) `orElse` b = a
class (MonadZero m) => MonadOr m where
  orElse :: m a -> m a -> m a

6.2
TheOtherPrelude.Utilities

-- module: TheOtherPrelude.Utilities
 
import Prelude () -- hide everything
 
-- this is the if-then-else proposal
-- the name has been chosen to reflect the magic of Church booleans!
boolean True  x _ = x
boolean False _ y = x

7 How To Use

-- ''The Other Prelude'' is an alternative, not a replacement.
-- So we need to hide everything from the Prelude
import Prelude ()                                
 
-- This is just an example assuming there is nothing to hide
import TheOtherPrelude                               
 
-- Hopefully, this module will contain lift,...
-- Standard convention is to use M.lift (instead of liftM)
import qualified TheOtherPrelude.Monad.Kleisli as M

8 See also