2010-08-05 25 views

Respuesta

44

Nop. La traducción directa más cercana es algo así como

\k -> case() of 
     _ | k < 0  -> "negative" 
     | k == 0 -> "zero" 
     | otherwise -> "positive" 
+1

nunca pensó en el uso de '' sobre _'() ': D –

+2

Se puede utilizar sobre cualquier cosa, por supuesto, pero'() 'es corta y, probablemente, menos confuso. –

+3

También podría considerar la función 'seleccionar' http://www.haskell.org/haskellwiki/Case#Using_functions – singpolyma

25

Me gusta mantener lambdas corto y dulce para no romper el flujo visual del lector. Para una función cuya definición es lo suficientemente sintácticamente voluminosa como para garantizar guardias, ¿por qué no incluirla en una cláusula where?

showSign k = mysign ++ " (" ++ show k ++ ")" 
    where 
    mysign 
    | k < 0  = "negative" 
    | k == 0 = "zero" 
    | otherwise = "positive" 
35

A partir de GHC 7.6.1 hay una extensión llamada MultiWayIf que le permite escribir lo siguiente:

\k -> if 
    | k < 0  -> "negative" 
    | k == 0 -> "zero" 
    | otherwise -> "positive" 

que al menos es más agradable a la vista que la alternativa usando case.

Para de coincidencia de patrón, hay una extensión relacionada llama LambdaCase:

\case 
    "negative" -> -1 
    "zero"  -> 0 
    "positive" -> 1 
    _   -> error "invalid sign" 

Estas extensiones no son parte del estándar Haskell, sin embargo, y necesitan ser habilitado explícitamente a través de un pragma {-# LANGUAGE LambdaCase #-} o {-# LANGUAGE MultiWayIf #-} en la parte superior del archivo, o compilando con la bandera -XLambdaCase o -XMultiWayIf.

3

Una forma elegante y concisa de hacerlo con LambdaCase:

{-# LANGUAGE LambdaCase #-} 

\case k | k < 0  -> "negative" 
     | k == 0 -> "zero" 
     | otherwise -> "positive" 

o

\case 
    k | k < 0  -> "negative" 
    | k == 0 -> "zero" 
    | otherwise -> "positive" 

Un caso en el que lo usé, para coger un error EOF:

{-# LANGUAGE ScopedTypeVariables #-} 

o <- hGetContents e `catch` (\case (e :: IOException) | isEOFError e -> return "") 
Cuestiones relacionadas