
-1 for if then. The examples of "curried" if then else look, to my eyes, less readable than the pointed version. And it's easy enough to write a 'bool' deconstructor, or an 'ifM' for the monadic case. +1 for something to solve the "dummy <- m; case dummy of" problem. Here are the possibilities I can think of: 1) case of: m >>= case of Just _ <- z | guard -> a _ -> b 2) habit's case<- case<- m of Just _ <- z | guard -> a _ -> b 3) extended lambda (not sure what this would look like... would the below parse with the give layout?) m >>= \ Just _ <- z | guard -> a _ -> b To me, #3 looks less ad-hoc and I like the idea of loosening a restriction instead of introducing more sugar, but I'm not sure how the syntax would work out. Also, from another point of view, 'f x = ...' is sugared to combine a \ and a case, while \ is unsugared, so tacking some case sugar on to \ would introduce sugar in a previously sugar-free area. Of course that \ is already sugared to curry automatically, but if you rephrase this as "add more sugar" rather than "loosen a restriction" it suddenly becomes less attractive since now it's just sugar vs. sugar :) #2 looks the nicest for this specific use, but seems less general than #1. For instance, #1 allows "f = case of { ... } . g". So I like #1.