19 पॉइंट द्वारा GN⁺ 2024-09-13 | 3 टिप्पणियां | WhatsApp पर शेयर करें
  • "अव्यावहारिक", "अकादमिक", "निश"

    • जब लोगों को पता चलता है कि मेरी पसंदीदा programming language Haskell है, तो अक्सर उनकी यही प्रतिक्रिया होती है
    • मैं इसे सिर्फ hobby projects के लिए नहीं, बल्कि वास्तविक web servers बनाने के लिए भी इस्तेमाल करता हूँ
    • मैं Converge में Haskell पर काम करने वाली टीमों का नेतृत्व कर रहा हूँ
  • Haskell के बारे में गलतफहमियाँ

    • जिन समस्याओं को एक general-purpose programming language से हल किया जा सकता है, उन्हें दूसरी भाषाओं में भी हल किया जा सकता है
    • Python, Rust, Typescript आदि में जो कई features आए हैं, वे Haskell से प्रेरित हैं या वहाँ अधिक मज़बूती से लागू किए गए हैं
    • यह "उबाऊ तकनीक चुनो" वाली विचारधारा का एक रूपांतर लगता है
    • एक गलत धारणा यह भी है कि programming गणित नहीं है, इसलिए उसमें गणितीय तत्वों को बाहर रखा जाना चाहिए
  • इस लेख का उद्देश्य

    • यह तर्कसंगत रूप से समझाने की कोशिश करना कि Haskell ज़्यादातर programmers के लिए सबसे अच्छा विकल्प क्यों है
    • खास तौर पर उन लोगों के लिए उपयोगी जो मज़बूत software को productive तरीके से लिखना चाहते हैं
    • software लिखने के मज़ेदार पहलू पर भी ज़ोर देना
  • Unlearning और relearning

    • ज़्यादातर programmers imperative paradigm के आदी होते हैं
    • Haskell एक pure functional language है, इसलिए इसकी learning curve काफ़ी steep है
    • Haskell भाषा खुद, अगर इसे एक simple subset तक सीमित रखा जाए, तो सीखना आसान है
    • functional programming इस बात में एक पूर्ण बदलाव मांगती है कि हम programs को कैसे रचते हैं
    • यह प्रक्रिया एक programmer के रूप में विकसित होने में मदद करती है
    • Alan Perlis का उद्धरण:

      कोई भी भाषा जो programming के बारे में आपकी सोच को प्रभावित न करे, उसे जानना सार्थक नहीं है।

Syntax का संक्षिप्त परिचय

  • :: type signature को दर्शाता है (उदाहरण: myThing :: String)

  • function call में parentheses का उपयोग नहीं होता; function name के बाद arguments को spaces से अलग करके लिखा जाता है (उदाहरण: doSomething withThis withThat)

  • type signature में lowercase अक्षर type variables होते हैं, जो किसी भी type को दर्शाते हैं (उदाहरण: head :: [a] -> a)

  • दो तरह के arrows -> और => होते हैं:

    • -> function के type को बताता है (उदाहरण: add1 :: Int -> Int)
    • => type variable पर constraint बताता है, और यह हमेशा पहले आता है (उदाहरण: add1 :: Num a => a -> a)
  • comments -- से शुरू होते हैं

  • return एक सामान्य function है, इसका मतलब वह नहीं है जिसकी आप उम्मीद करते हैं

  • do ऐसा syntactic sugar है जो code को imperative जैसा दिखाता है

  • local variables को value assign करने के कई तरीके हैं:

    let x = <something> in  
    <expression>  
    

    या x <- <something>

  • गलतियाँ कम करना

    • कई भाषाओं में code को "सही" बनाने के लिए बहुत सारे test cases लिखने पड़ते हैं
    • Haskell अपने type system और pure functional programming की मदद से इस बोझ को काफ़ी कम कर देता है
    • Haskell का शक्तिशाली type system program के बारे में ठोस guarantees देता है और उन्हें सख़्ती से लागू करता है
    • type system की विशेषताएँ:
      • nullable types नहीं हैं
      • ऐसे computations को व्यक्त किया जा सकता है जो fail हो सकते हैं
      • pattern matching और exhaustiveness checks
      • primitive obsession से आसानी से बचाव
  • null values न होने के फायदे

    • null value मौजूद नहीं होती, इसलिए आप हमेशा जानते हैं कि value अपेक्षित type की है
    • इससे runtime errors रुकते हैं और errors की surface area कम होती है
  • ऐसे computations की अभिव्यक्ति जो fail हो सकते हैं

    • Maybe और Either types का उपयोग करके ऐसे computations को explicitly व्यक्त किया जाता है जो fail हो सकते हैं
    • Maybe उस computation को दर्शाता है जिसका result हो भी सकता है और नहीं भी
      safeHead :: [a] -> Maybe a  
      
    • Either के पास दो तरह के values हो सकते हैं (Left a या Right b)
      validateAddress :: String -> Either AddressParseError ValidAddress  
      
  • Pattern matching और exhaustiveness checks

    • आपको पूरे input domain को handle करना होता है, वरना compiler error देता है
    • इससे runtime errors रुकते हैं और program की reliability बढ़ती है
  • Primitive obsession से बचाव

    • newtype का उपयोग करके अधिक semantic अर्थ वाले types आसानी से बनाए जा सकते हैं
    newtype VenueName = VenueName String  
    newtype EventName = EventName String  
    
  • Pure functional programming के फायदे

    • data immutable होता है, इसलिए state mutation की चिंता नहीं करनी पड़ती
    • side effects को explicitly handle किया जाता है, और functions बिना side effects के केवल input पर निर्भर करते हैं
    • इससे program की predictability और stability बढ़ती है
  • Side effects का explicit handling

    • IO monad का उपयोग करके side effects को code से अलग किया और नियंत्रित किया जाता है
    • function की type signature देखकर ही पता चल जाता है कि वह side effects पैदा करता है
    sendGreetings :: User -> IO Response  
    
  • Monads और effect control

    • typeclasses और monads का उपयोग करके ठीक-ठीक encode किया जाता है कि functions कौन-से effects कर सकते हैं
    • इससे अनचाहे side effects रुकते हैं और code की stability बढ़ती है
  • Productivity बढ़ाने वाले तत्व

    • शक्तिशाली type system और pure functional nature की वजह से code reuse और concepts का generalization आसान हो जाता है
    • Functor और Monoid जैसे concepts के ज़रिए एक ही pattern को कई data structures पर लागू किया जा सकता है
    fmap (+2) [1, 2, 3] -- [3, 4, 5]  
    fmap (+2) (Just 2) -- Just 4  
    
  • निर्भय refactoring

    • compiler की सख़्ती की वजह से code बदलते समय नए bugs आने का जोखिम कम होता है
    • type system program domain को सटीक रूप से व्यक्त करने देता है, इसलिए आप भरोसे के साथ code बदल सकते हैं
  • Program की समझ बेहतर होना

    • declarative programming के माध्यम से problem domain को सटीक रूप से व्यक्त किया जा सकता है
    • program के अर्थ को आसानी से समझा जा सकता है और उसकी reliability बढ़ाई जा सकती है
    • अनावश्यक complexity हटने से program के बारे में तार्किक reasoning संभव हो जाती है
  • Algebraic data types और typeclasses

    • Haskell के भीतर domain-specific languages बनाई जा सकती हैं
    • इससे program को समझने और maintain करने में मदद मिलती है
  • उदाहरण program

    • एक सरल accounting tool लिखकर Haskell के concepts को व्यावहारिक रूप से लागू किया गया है

Epilogue

  • Haskell का उपयोग करना आनंददायक और productive है
  • शक्तिशाली और expressive type system के साथ pure functional programming का संयोजन Haskell को विशेष बनाता है
  • दूसरी भाषाएँ भी इन features को अपना रही हैं, लेकिन Haskell में ये विशेषताएँ उसकी बुनियाद में मौजूद हैं
  • Haskell सीखना programming के बारे में आपकी सोच को बदल देगा

GN⁺ की राय

  • Haskell का learning value

    • यह एक programmer के रूप में सोच के दायरे को बढ़ाने में मदद करता है
    • functional programming paradigm को समझ लेने पर आप दूसरी भाषाओं में भी बेहतर code लिख सकते हैं
  • Functional programming का उभार

    • parallel processing और concurrency में इसकी ताकत इसे आधुनिक computing environments के लिए उपयुक्त बनाती है
    • side effects के नियंत्रण की वजह से अधिक predictable code लिखना संभव होता है
  • दूसरी भाषाओं से तुलना

    • Rust या Scala जैसी भाषाएँ भी functional programming को support करती हैं, लेकिन Haskell की purity और type system अलग ही स्तर पर हैं
    • नई भाषा सीखते समय Haskell के concepts बहुत मददगार हो सकते हैं
  • व्यावहारिक उपयोग की संभावना

    • शुरुआती learning curve कठिन है, लेकिन जितना समय निवेश करते हैं, उतनी productivity बढ़ती है
    • जटिल systems या error-sensitive domains में यह उपयोगी है
  • Community और ecosystem

    • Haskell community सक्रिय है, और तरह-तरह की libraries और tools लगातार विकसित किए जा रहे हैं
    • open source projects में भाग लेकर अपनी क्षमता बढ़ाई जा सकती है

3 टिप्पणियां

 
cosine20 2024-09-19

मैंने व्यावहारिकता से सुसज्जित F# से शुरुआत की थी।

 
savvykang 2024-09-13

ADT और pattern matching अच्छे हैं, लेकिन कृपया monad और functor की बातें बंद कीजिए

 
GN⁺ 2024-09-13
Hacker News राय
  • Haskell आंशिक functions की जगह total functions लिखने के लिए मजबूर करता है

    • Haskell infinite recursion को नहीं रोकता
    • dependent types की ओर बढ़ते FP ecosystem में यह महत्वपूर्ण है कि type checker अनंत समय तक न चले
    • Haskell के कई ad-hoc extensions समस्याएँ पैदा करते हैं
    • अगर आपको Haskell का दर्शन पसंद है, तो केवल Haskell तक सीमित नहीं रहना चाहिए
    • Haskell का standardization असफल रहा
    • GHC की unique value proposition शायद GHC runtime system हो सकती है
  • मैं 10 साल से Haskell का उपयोग कर रहा हूँ और tooling में बहुत सुधार हुआ है

    • ghcup, cabal sandboxing, HLS स्थिर हैं
    • library ecosystem में मुझे बहुत कमी महसूस नहीं हुई
    • Haskell का compile time अभी भी असुविधाजनक है
    • dependency compile time लंबा हो जाता है
  • Haskell का type system यह साबित नहीं करता कि functions total हैं

    • सामान्य programming में totality proof उपयोगी नहीं होता
    • अधिकांश लोग tests के ज़रिए यह जाँचते हैं कि program वास्तव में काम करता है या नहीं
  • Haskell भाषा अच्छी है, लेकिन ecosystem को अभी बहुत आगे जाना है

    • compiler धीमा है
    • error reporting क्षमता कमज़ोर है
    • पहली error बाकी compilation रोक देती है
    • tooling दूसरे functional languages की तुलना में अभी भी कमज़ोर है
    • library ecosystem कमज़ोर है
    • Haskell के ideas ने कई दूसरी भाषाओं को प्रभावित किया है
  • मैं Haskell या किसी दूसरी functional language को पेशेवर रूप से इस्तेमाल करना चाहता हूँ

    • Go जैसी languages सीखना आसान था
    • मैं functional languages में codebase बनाना सीखना चाहता हूँ
  • Haskell ने programming mindset और code architecture पर बड़ा प्रभाव डाला है

    • Haskell का type system बहुत शक्तिशाली है और समझना आसान है
    • Haskell code को micro-optimize करना मज़ेदार था
    • tooling अभी भी कमज़ोर है
  • Haskell language level पर laziness के साथ प्रयोग करता है

    • laziness standard library level पर भी प्राप्त की जा सकती है
  • Haskell की चरम purity और immutability समस्या है

    • कई programmers के लिए procedural/mutable loops को व्यक्त करना ज़्यादा आसान होता है
    • Rust एक सक्षम type system और कई functional idioms का उपयोग करता है, लेकिन loops और mutability की अनुमति भी देता है
  • Haskell business logic software (BLOBS) के लिए बहुत उपयुक्त है

    • simple types और pattern matching से अधिकांश business logic को model किया जा सकता है
    • अगर सरल हिस्सों को सरल ही रखा जाए, तो non-technical contributors को भी इसे आसानी से सिखाया जा सकता है
    • Haskell मज़ेदार है