
On 02.10.2010, at 20:35, Henning Thielemann wrote:
On Sat, 2 Oct 2010, Colin Paul Adams wrote:
Prelude> (if then "Haskell" else "Cafe") False Max> "Cafe"
My reaction is to ask:
Can you write this as:
(if then else) False "Haskell" "Cafe"
?
Sure:
ifThenElse :: Bool -> a -> a -> a ifThenElse True x _ = x ifThenElse False _ y = y
Prelude> ifThenElse False "Haskell" "Cafe"
You can use a similar approach for case expressions ; ) import Prelude hiding ( catch ) import System.IO.Unsafe ( unsafePerformIO ) import Control.Exception ( catch, evaluate, PatternMatchFail ) caseOf :: a -> [a -> b] -> b caseOf x = unsafePerformIO . firstMatch . map ($x) firstMatch :: [a] -> IO a firstMatch (x:xs) = catch (evaluate x) (handlePatternFail (firstMatch xs)) handlePatternFail :: a -> PatternMatchFail -> a handlePatternFail x _ = x test = (flip caseOf [\1 -> "One", \_ -> "Not-one"]) 1 Well, to tell the truth this does not work correctly as the following example shows. test2 = (flip caseOf [\1 -> ((\2 -> "One") 3), \_ -> "Not-one"]) 1