2011-03-22 17 views
21

¿Hay alguna forma de realizar un caso sobre el valor almacenado dentro de una mónada sin tener que vincular un nombre al mismo?caso en el valor monádico

es decir, en lugar de hacer esto:

c <- getChar 
case c of 
    ... 

¿Hay una manera de hacer esto:

mcase getChar of 
    ... 

Como alternativa, sería bueno si la declaración de caso podría aplicarse de manera parcial:

case of 
    ... 

se desglosará a:

\a -> case a of 
    ... 

Por lo que podría hacer esto:

getChar >>= case of 
       ... 
+0

Puede que ya esté al tanto de esto, pero hubo una [discusión] (http://thread.gmane.org/gmane.comp.lang.haskell.cafe/81366/) en haskell-cafe sobre esta característica exacta . El lado de GHC [no parece tener un problema con él] (http://article.gmane.org/gmane.comp.lang.haskell.cafe/81533), así que tal vez veremos esto implementado tarde o temprano. –

Respuesta

5

La respuesta es no. En Haskell 98, no puede usar una declaración de caso sin usar un nombre dentro de ella. Pero hay un proposal para agregar soporte para case-lambdas. La sintaxis que proponen es la misma que tú propones también.

6

No, no realmente, pero se puede mover el caso a otra función y aplicarlo al resultado de una acción monádico.

f x = case x of ... 

main = do 
    f <$> getChar 

Alternativly, lo siguiente es posible:

getChar >>= \x -> case x of ... 
+0

Sí, pero luego el valor ** tiene ** asignado el nombre 'x'. Me encuentro con esto cuando estoy cambiando el código no monádico en código monádico y tengo que hacer una cirugía en las declaraciones de casos. – pat

+0

Luego usa mi primer enfoque. – jmg

+4

Creo que el primer caso es el mejor. Luego puede soltar la declaración de mayúsculas y minúsculas y hacer la coincidencia de patrones en la definición de la función. – HaskellElephant

13

La propuesta mencionada por FUZxxl ahora se implementó en GHC desde 7.6.1, se llama LambdaCase.

Ahora usted puede hacer:

{-# LANGUAGE LambdaCase #-} 
getChar >>= \case 
    ... 

Nota del \ antes de la case palabra clave y el hecho de que no hay of en ese caso.

+0

También debería haber algo similar para 'if': D – remdezx

+1

@remdezx, realmente no necesitas algo similar para' if'. Solo usa 'bool' de' Data.Boolean'. – dfeuer

Cuestiones relacionadas