2010-08-05 17 views

उत्तर

44

नहीं। निकटतम प्रत्यक्ष अनुवाद कुछ

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

कभी 'का उपयोग करने पर _''() 'के बारे में सोचा: डी –

+2

आप निश्चित रूप से भी बात को लेकर इसका इस्तेमाल कर सकते हैं, लेकिन'() 'छोटी और शायद कम से कम भ्रामक है। –

+3

आप 'चयन' फ़ंक्शन http://www.haskell.org/haskellwiki/Case#Using_functions पर भी विचार कर सकते हैं – singpolyma

25

मुझे लेम्बास को छोटा और मीठा रखना पसंद है ताकि पाठक के दृश्य प्रवाह को तोड़ने न पाए। एक समारोह के लिए जिसका परिभाषा वारंट गार्ड के लिए काफी हद तक भारी है, क्यों इसे where खंड में चिपकाएं?

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

कौन सा कम से कम और अधिक case का उपयोग कर विकल्प की तुलना में को देखने के लिए सुखद है:

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

GHC 7.6.1 के रूप में वहाँ एक विस्तार MultiWayIf कहा जाता है आप निम्नलिखित लिखने देता है।

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

इन एक्सटेंशन मानक हास्केल का हिस्सा है, हालांकि नहीं हैं, और शीर्ष पर एक {-# LANGUAGE LambdaCase #-} या {-# LANGUAGE MultiWayIf #-} pragma के माध्यम से स्पष्ट रूप से सक्षम किया जाना आवश्यक:

पैटर्न मिलान के लिए, वहाँ एक संबंधित विस्तार LambdaCase कहा जाता है फ़ाइल का, या ध्वज -XLambdaCase या -XMultiWayIf के साथ संकलित करके।

3

एक सुरुचिपूर्ण और संक्षिप्त तरीके LambdaCase साथ यह करने के लिए:

{-# LANGUAGE LambdaCase #-} 

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

या

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

एक मामला है जब मैं इसका इस्तेमाल किया, एक EOF त्रुटि को पकड़ने के लिए:

{-# LANGUAGE ScopedTypeVariables #-} 

o <- hGetContents e `catch` (\case (e :: IOException) | isEOFError e -> return "") 
संबंधित मुद्दे