Haskell क्यों?
(gtf.io)-
"अव्यावहारिक", "अकादमिक", "निश"
- जब लोगों को पता चलता है कि मेरी पसंदीदा 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 न होने के फायदे
nullvalue मौजूद नहीं होती, इसलिए आप हमेशा जानते हैं कि value अपेक्षित type की है- इससे runtime errors रुकते हैं और errors की surface area कम होती है
-
ऐसे computations की अभिव्यक्ति जो fail हो सकते हैं
MaybeऔरEithertypes का उपयोग करके ऐसे computations को explicitly व्यक्त किया जाता है जो fail हो सकते हैंMaybeउस computation को दर्शाता है जिसका result हो भी सकता है और नहीं भीsafeHead :: [a] -> Maybe aEitherके पास दो तरह के 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
IOmonad का उपयोग करके 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 टिप्पणियां
मैंने व्यावहारिकता से सुसज्जित F# से शुरुआत की थी।
ADT और pattern matching अच्छे हैं, लेकिन कृपया monad और functor की बातें बंद कीजिए
Hacker News राय
Haskell आंशिक functions की जगह total functions लिखने के लिए मजबूर करता है
मैं 10 साल से Haskell का उपयोग कर रहा हूँ और tooling में बहुत सुधार हुआ है
Haskell का type system यह साबित नहीं करता कि functions total हैं
Haskell भाषा अच्छी है, लेकिन ecosystem को अभी बहुत आगे जाना है
मैं Haskell या किसी दूसरी functional language को पेशेवर रूप से इस्तेमाल करना चाहता हूँ
Haskell ने programming mindset और code architecture पर बड़ा प्रभाव डाला है
Haskell language level पर laziness के साथ प्रयोग करता है
Haskell की चरम purity और immutability समस्या है
Haskell business logic software (BLOBS) के लिए बहुत उपयुक्त है