Re: [Haskell-cafe] Why doesn't this work? (palindrome :: IO)

2011-12-11 Thread Yitzchak Gale
Brandon Allbery wrote:
  case () of
    () | s == reverse s - putStrLn palindrome
    _                   - putStrLn nope

Tom Murphy wrote:
 This is kind of a hack of case, though. I think what the OP was looking
 for is
  isPalindrome word
   | (word == reverse word) = putStrLn (word ++  is a palindrome)
   | otherwise              = putStrLn (word ++  is not a palindrome)

 Erm?  It's as much of a hack of case as yours is, since the above is
 actually using case.

I agree with Tom here. While it's true that the compiler
internally desugars to case, that low-level compiler
transformation doesn't have much to do with the
best way to write clear code.

I find that case often creates code that is more
confusing and bug-prone. Except when what I
really want to express is pattern matching, *and*
there is some specific reason here why I don't
want to use a named function in a let or where
binding. Altogether, it doesn't come up very often
for me.

And even for styles that use case more than I
do, certainly there is room to call the use of
the case () idiom a hack. (Even though I'll
admit that I do use it sometimes.)

Regards,
Yitz

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


Re: [Haskell-cafe] Why doesn't this work? (palindrome :: IO)

2011-12-11 Thread Tom Murphy
To clarify, by hack I meant that it seemed like a workaround specifically
to keep case in the OP's code, when it seemed like they were looking for
the functionality of guards.

amindfv / Tom
On Dec 11, 2011 1:39 PM, Yitzchak Gale g...@sefer.org wrote:

 Brandon Allbery wrote:
   case () of
 () | s == reverse s - putStrLn palindrome
 _   - putStrLn nope

 Tom Murphy wrote:
  This is kind of a hack of case, though. I think what the OP was looking
  for is
   isPalindrome word
| (word == reverse word) = putStrLn (word ++  is a palindrome)
| otherwise  = putStrLn (word ++  is not a palindrome)

  Erm?  It's as much of a hack of case as yours is, since the above is
  actually using case.

 I agree with Tom here. While it's true that the compiler
 internally desugars to case, that low-level compiler
 transformation doesn't have much to do with the
 best way to write clear code.

 I find that case often creates code that is more
 confusing and bug-prone. Except when what I
 really want to express is pattern matching, *and*
 there is some specific reason here why I don't
 want to use a named function in a let or where
 binding. Altogether, it doesn't come up very often
 for me.

 And even for styles that use case more than I
 do, certainly there is room to call the use of
 the case () idiom a hack. (Even though I'll
 admit that I do use it sometimes.)

 Regards,
 Yitz

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


Re: [Haskell-cafe] Why doesn't this work? (palindrome :: IO)

2011-12-09 Thread Yves Parès
Why do you people hate 'if' statements?

2011/12/9 Brandon Allbery allber...@gmail.com

 On Thu, Dec 8, 2011 at 15:52, Tom Murphy amin...@gmail.com wrote:

 On Wed, Dec 7, 2011 at 11:46 PM, Brandon Allbery allber...@gmail.comwrote:

  case () of
() | s == reverse s - putStrLn palindrome
_   - putStrLn nope



 This is kind of a hack of case, though. I think what the OP was looking
 for is

  isPalindrome word

   | (word == reverse word) = putStrLn (word ++  is a palindrome)
   | otherwise  = putStrLn (word ++  is not a palindrome)


 Erm?  It's as much of a hack of case as yours is, since the above is
 actually using case.


 --
 brandon s allbery  allber...@gmail.com
 wandering unix systems administrator (available) (412) 475-9364 vm/sms


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


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


Re: [Haskell-cafe] Why doesn't this work? (palindrome :: IO)

2011-12-09 Thread Brandon Allbery
On Fri, Dec 9, 2011 at 04:16, Yves Parès limestr...@gmail.com wrote:

 Why do you people hate 'if' statements?


It's more that the language spec does; if statements, along with a number
of other things, desugar to case which is the fundamental conditional
construct.

(And more personally, I find the indentation behavior annoying, in that I
need to indent then and else more inside something that uses layout; plus
the lack of an else if that is aware of being part of a compound means that
it ladders even more, so I end up switching to case just to keep from
ending up on column 200 or something.)

-- 
brandon s allbery  allber...@gmail.com
wandering unix systems administrator (available) (412) 475-9364 vm/sms
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Why doesn't this work? (palindrome :: IO)

2011-12-09 Thread Yves Parès
I agree with all that, but in *this *special case, I think that

case something of
   True - 
   False - 

is less nice and obvious than

if something
   then 
   else 

2011/12/9 Brandon Allbery allber...@gmail.com

 On Fri, Dec 9, 2011 at 04:16, Yves Parès limestr...@gmail.com wrote:

 Why do you people hate 'if' statements?


 It's more that the language spec does; if statements, along with a number
 of other things, desugar to case which is the fundamental conditional
 construct.

 (And more personally, I find the indentation behavior annoying, in that I
 need to indent then and else more inside something that uses layout; plus
 the lack of an else if that is aware of being part of a compound means
 that it ladders even more, so I end up switching to case just to keep
 from ending up on column 200 or something.)

 --
 brandon s allbery  allber...@gmail.com
 wandering unix systems administrator (available) (412) 475-9364 vm/sms


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


Re: [Haskell-cafe] Why doesn't this work? (palindrome :: IO)

2011-12-09 Thread Brandon Allbery
On Fri, Dec 9, 2011 at 05:16, Yves Parès limestr...@gmail.com wrote:

 I agree with all that, but in *this *special case, I think that


I should also note that the OP mentioned using if, but was
surprised/confused by the behavior of case, which is why that's what we've
been focusing on.

-- 
brandon s allbery  allber...@gmail.com
wandering unix systems administrator (available) (412) 475-9364 vm/sms
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Why doesn't this work? (palindrome :: IO)

2011-12-08 Thread Paul R
Alexej The interesting thing is, that if I change the case ... of
Alexej statement to an if ... then ... else statement, this magically
Alexej starts to work. Since I no longer am enrolled (I have to take
Alexej the course next year), I can't ask a teacher, but my curiosity
Alexej still bugs me. Why doesn't this work? And why does it work with
Alexej a if ... then ...else statement?

maybe you mixed up 'if' and 'case' usages. In fact, 'if' can alway be
translated to 'case' by matching on the boolean condition, like below :

case (s == reverse s) of
  True - s is a palindrome
  False - s is not a palindrome



-- 
  Paul

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


Re: [Haskell-cafe] Why doesn't this work? (palindrome :: IO)

2011-12-08 Thread Tom Murphy
On Wed, Dec 7, 2011 at 11:46 PM, Brandon Allbery allber...@gmail.comwrote:

 On Wed, Dec 7, 2011 at 23:24, Alexej Segeda aloscha_den_st...@hotmail.com
  wrote:

 case s of
(s == reverse s)- putStrLn (s ++  is a
 palindrome)
otherwise   - putStrLn (s ++  is not a
 palindrome)


 case does pattern matching, not Boolean expressions.  (s == reverse s) is
 not a useful pattern, and in fact is probably a syntax error because ==is not 
 a valid infix constructor.

 If you want to do Boolean comparisons in a case, you need to use
 something like

  case () of
() | s == reverse s - putStrLn palindrome
_   - putStrLn nope




This is kind of a hack of case, though. I think what the OP was looking for
is

palindrome :: IO ()
palindrome = do putStrLn Type in a word
s - getLine
isPalindrome s

isPalindrome word
  | (word == reverse word) = putStrLn (word ++  is a palindrome)
  | otherwise  = putStrLn (word ++  is not a palindrome)


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


Re: [Haskell-cafe] Why doesn't this work? (palindrome :: IO)

2011-12-08 Thread Brandon Allbery
On Thu, Dec 8, 2011 at 15:52, Tom Murphy amin...@gmail.com wrote:

 On Wed, Dec 7, 2011 at 11:46 PM, Brandon Allbery allber...@gmail.comwrote:

  case () of
() | s == reverse s - putStrLn palindrome
_   - putStrLn nope



 This is kind of a hack of case, though. I think what the OP was looking
 for is

 isPalindrome word

   | (word == reverse word) = putStrLn (word ++  is a palindrome)
   | otherwise  = putStrLn (word ++  is not a palindrome)


Erm?  It's as much of a hack of case as yours is, since the above is
actually using case.

-- 
brandon s allbery  allber...@gmail.com
wandering unix systems administrator (available) (412) 475-9364 vm/sms
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


[Haskell-cafe] Why doesn't this work? (palindrome :: IO)

2011-12-07 Thread Alexej Segeda

Hi!

A couple of months ago, I wrote an exam in an introductory Haskell course and 
failed, all because of an assignment that I was convinced would work, but for 
some reason, it didn't. The assignment was to write a function that would take 
a line, then determine whether it's a palindrome or not. My code follows:

palindrome :: IO ()
palindrome = do putStr Type in a word
s - getLine
case s of
   (s == reverse s)- putStrLn (s ++  is a palindrome)
   otherwise   - putStrLn (s ++  is not a palindrome)

The interesting thing is, that if I change the case ... of statement to an 
if ... then ... else statement, this magically starts to work. Since I no 
longer am enrolled (I have to take the course next year), I can't ask a 
teacher, but my curiosity still bugs me. Why doesn't this work? And why does it 
work with a if ... then ...else statement?
  ___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


Re: [Haskell-cafe] Why doesn't this work? (palindrome :: IO)

2011-12-07 Thread Brandon Allbery
On Wed, Dec 7, 2011 at 23:24, Alexej Segeda
aloscha_den_st...@hotmail.comwrote:

 case s of
(s == reverse s)- putStrLn (s ++  is a
 palindrome)
otherwise   - putStrLn (s ++  is not a
 palindrome)


case does pattern matching, not Boolean expressions.  (s == reverse s) is
not a useful pattern, and in fact is probably a syntax error because == is
not a valid infix constructor.

If you want to do Boolean comparisons in a case, you need to use something
like

 case () of
   () | s == reverse s - putStrLn palindrome
   _   - putStrLn nope

(otherwise isn't doing what you think there, either; it's exactly
equivalent to the _ (unnamed placeholder) I used, since you aren't then
using otherwise as the local binding (shadowing the Prelude one) that it
is.)

-- 
brandon s allbery  allber...@gmail.com
wandering unix systems administrator (available) (412) 475-9364 vm/sms
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe