2010-08-05 4 views

Répondre

44

Non. La traduction directe la plus proche est quelque chose un peu comme

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

jamais pensé à utiliser '' _' sur() ': D –

+2

Vous pouvez l'utiliser sur quoi que ce soit, bien sûr, mais'() 'est courte et probablement moins déroutant. –

+3

Vous pouvez également considérer la fonction 'select' http://www.haskell.org/haskellwiki/Case#Using_functions – singpolyma

25

J'aime garder lambdas court et doux afin de ne pas casser le flux visuel du lecteur. Pour une fonction dont la définition est suffisamment encombrante pour justifier les gardes, pourquoi ne pas la coller dans une clause where?

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

Au GHC 7.6.1 il y a une extension appelée MultiWayIf qui vous permet d'écrire:

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

qui, à tout le moins est plus agréable à regarder que l'alternative à l'aide case.

Pour ltrage, il y a une extension connexe appelé LambdaCase:

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

Ces extensions ne font pas partie de Haskell standard, cependant, et doivent être activés explicitement par une {-# LANGUAGE LambdaCase #-} ou {-# LANGUAGE MultiWayIf #-} pragma en haut du fichier, ou en compilant avec le drapeau -XLambdaCase ou -XMultiWayIf.

3

Une façon élégante et concise de le faire avec LambdaCase:

{-# LANGUAGE LambdaCase #-} 

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

ou

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

Un cas quand je l'ai utilisé, pour attraper une erreur EOF:

{-# LANGUAGE ScopedTypeVariables #-} 

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