Remove ads
പ്രോഗ്രാമിങ് ഭാഷ From Wikipedia, the free encyclopedia
ഹാസ്കൽ ഉച്ചാരണം:/ˈhæskəl/[19] ഒരു സ്റ്റാൻഡേർസ്ഡ്, പൊതു-ഡവലപ്മെൻറ് കമ്പൈൽ, നോൺ സ്ട്രിറ്റ് സെമൻറിക്കുകളും ശക്തമായ സ്റ്റാറ്റിക് ടൈപ്പിംഗും മാത്രമുള്ളതാണ്. തന്ത്രജ്ഞനായ ഹാസ്കൽ കറിയാണ് ഇതിന് ഈ പേര് നൽകിയത്. ഹാസ്കലിൻറെ ഏറ്റവും പുതിയ സ്റ്റാൻഡേർഡ് ഹാസ്കൽ 2010. 2016 മേയ് മാസം മുതൽ, ഹാസ്കൽ 2020 എന്ന പുതിയ പതിപ്പിന് വേണ്ടി ഒരു ഗ്രൂപ്പ് പ്രവർത്തിക്കുന്നു.[20]
ശൈലി: | Purely functional |
---|---|
രൂപകൽപ്പന ചെയ്തത്: | Lennart Augustsson, Dave Barton, Brian Boutel, Warren Burton, Joseph Fasel, Kevin Hammond, Ralf Hinze, Paul Hudak, John Hughes, Thomas Johnsson, Mark Jones, Simon Peyton Jones, John Launchbury, Erik Meijer, John Peterson, Alastair Reid, Colin Runciman, Philip Wadler |
ഡാറ്റാടൈപ്പ് ചിട്ട: | Inferred, static, strong |
പ്രധാന രൂപങ്ങൾ: | GHC, Hugs, NHC, JHC, Yhc, UHC |
വകഭേദങ്ങൾ: | Gofer |
സ്വാധീനിച്ചത്: | Agda,[1] Bluespec,ലുവ പിഴവ് ഘടകം:Footnotes-ൽ 80 വരിയിൽ : bad argument #1 to 'ipairs' (table expected, got nil) C++11/Concepts,[2] C#/LINQ,ലുവ പിഴവ് ഘടകം:Footnotes-ൽ 80 വരിയിൽ : bad argument #1 to 'ipairs' (table expected, got nil)[3][4][5] CAL,[അവലംബം ആവശ്യമാണ്] Cayenne,ലുവ പിഴവ് ഘടകം:Footnotes-ൽ 80 വരിയിൽ : bad argument #1 to 'ipairs' (table expected, got nil) Clean,ലുവ പിഴവ് ഘടകം:Footnotes-ൽ 80 വരിയിൽ : bad argument #1 to 'ipairs' (table expected, got nil) Clojure,[6] CoffeeScript,[7] Curry,ലുവ പിഴവ് ഘടകം:Footnotes-ൽ 80 വരിയിൽ : bad argument #1 to 'ipairs' (table expected, got nil) Elm, Epigram,[അവലംബം ആവശ്യമാണ്] Escher,[8] F#,[9] Hack,[10] Idris,[11] Isabelle,ലുവ പിഴവ് ഘടകം:Footnotes-ൽ 80 വരിയിൽ : bad argument #1 to 'ipairs' (table expected, got nil) Java/Generics,ലുവ പിഴവ് ഘടകം:Footnotes-ൽ 80 വരിയിൽ : bad argument #1 to 'ipairs' (table expected, got nil) LiveScript,[12] Mercury,ലുവ പിഴവ് ഘടകം:Footnotes-ൽ 80 വരിയിൽ : bad argument #1 to 'ipairs' (table expected, got nil) Ωmega, PureScript,[13] Python,ലുവ പിഴവ് ഘടകം:Footnotes-ൽ 80 വരിയിൽ : bad argument #1 to 'ipairs' (table expected, got nil)[14] Raku,[15] Rust,[16] Scala,ലുവ പിഴവ് ഘടകം:Footnotes-ൽ 80 വരിയിൽ : bad argument #1 to 'ipairs' (table expected, got nil)[17] Swift,[18] Visual Basic 9.0ലുവ പിഴവ് ഘടകം:Footnotes-ൽ 80 വരിയിൽ : bad argument #1 to 'ipairs' (table expected, got nil)[3] |
വെബ് വിലാസം: | haskell |
തരം അനുമാനവും[21][22] അലസമായ മൂല്യനിർണ്ണയവുമുള്ള ഒരു തരം സിസ്റ്റം ഹാസ്കലിനുണ്ട്. ഹാസ്കൽ പ്രോഗ്രാമിങ് ഭാഷയിൽ ആദ്യമായി ടൈപ്പ് ക്ലാസ്സുകൾ പ്രത്യക്ഷപ്പെട്ടു.[23]ഇതിൻറെ പ്രധാന നിർവ്വഹണം ഗ്ലാസ്ഗോ ഹാസ്കൽ കംപൈലർ ആണ്.
ഹാസ്കെൽ സെമാൻറിക്സുകളെ അടിസ്ഥാനമാക്കിയുള്ളതാണ്, മിറാൻഡ ഭാഷയുടെ വാക്യഘടനയല്ല, ഇത് ആദ്യ ഹാസ്കൽ വർക്കിംഗ് ഗ്രൂപ്പിൻറെ പരിശ്രമങ്ങളിൽ ശ്രദ്ധ കേന്ദ്രീകരിച്ചു.[24] അക്കാമിഡിയിൽ (academia) ഹാസ്കെൽ വ്യാപകമായി ഉപയോഗിക്കുന്നു.[25][26] മാത്രമല്ല വ്യവസായത്തിലും.[27]
മിറണ്ടയുടെ ഗവേഷണ സോഫ്റ്റ് വെയർ ലിമിറ്റഡ് 1985 ൽ പുറത്തിറക്കിയതിനെ തുടർന്ന്, ഫങ്ഷണൽ ഭാഷകളോടുള്ള താത്പര്യം വളർന്നു. 1987-ൽ, ഒരു ഡസൻ നോൺ-സ്ട്രോക്ക്, മൾട്ടിപ്പിൾ ഫങ്ഷണൽ പ്രോഗ്രാമിങ് ഭാഷകളിലുമുണ്ടായിരുന്നു. മിറാൻഡ വളരെ വ്യാപകമായിരുന്നു, പക്ഷെ കുത്തക സോഫ്റ്റ്വെയറായിരുന്നു. പോളണ്ടിലെ ഓറിഗോൺ എന്ന സ്ഥലത്തെ കോൺഫ്രൻസിൽ വച്ച് ഫംഗ്ഷണൽ പ്രോഗ്രാമിംഗ് കമ്പ്യൂട്ടർ ആർക്കിടെക്ചർ (FPCA '87) ഇത്തരം ഭാഷകൾക്കുള്ള തുറന്ന മാനദണ്ഡം നിർവ്വചിക്കുന്നതിനായി ഒരു കമ്മിറ്റി രൂപം കൊള്ളുന്നതിന് ഒരു ശക്തമായ സമവായമുണ്ടായിരുന്നു. ഫംഗ്ഷണൽ-ഭാഷാ രൂപകൽപ്പനയിൽ ഭാവിയിൽ ഗവേഷണത്തിന് അടിത്തറയാകുന്നതിന് നിലവിലുള്ള പ്രവർത്തന ഭാഷകളെ ഏകീകൃതമാക്കുക എന്നതാണ് ഈ കമ്മിറ്റിയുടെ ഉദ്ദേശ്യം.ലുവ പിഴവ് ഘടകം:Footnotes-ൽ 80 വരിയിൽ : bad argument #1 to 'ipairs' (table expected, got nil)
ഹാസ്കലിന്റെ ആദ്യപതിപ്പ് ("ഹാസ്കൽ 1.0") 1990 ൽ നിർവ്വചിക്കപ്പെട്ടു.ലുവ പിഴവ് ഘടകം:Footnotes-ൽ 80 വരിയിൽ : bad argument #1 to 'ipairs' (table expected, got nil)സമിതിയുടെ പരിശ്രമങ്ങൾ ഭാഷാ നിർവ്വചനങ്ങളുടെ ഒരു പരമ്പരയ്ക്ക് കാരണമായി (1.0, 1.1, 1.2, 1.3, 1.4).
ഭാഷയുടെ സുസ്ഥിരമായ, ചുരുങ്ങിയ, പോർട്ടബിൾ പതിപ്പ്, അദ്ധ്യാപനത്തിനുള്ള അനുപമമായ ലൈബ്രറിയും, ഭാവി വിപുലീകരണത്തിനുള്ള ഒരു അടിത്തറയും ലക്ഷ്യമാക്കി 1997 ൻറെ അവസാനത്തിൽ, ഹാസ്കെൽ 98 പരമ്പര അവസാനിപ്പിച്ചു. ഹാസ്കൽ 98 ൻറെ വിപുലീകരണങ്ങളും വേരിയൻറുകളും സമിതി സ്വാഗതം ചെയ്തു.ലുവ പിഴവ് ഘടകം:Footnotes-ൽ 80 വരിയിൽ : bad argument #1 to 'ipairs' (table expected, got nil)
1999 ഫെബ്രുവരിയിൽ ഹാസ്കൽ 98 ഭാഷാ നിലവാരം ആദ്യം പ്രസിദ്ധീകരിച്ചത് ഹാസ്കൽ 98 റിപ്പോർട്ട് എന്നായിരുന്നു.ലുവ പിഴവ് ഘടകം:Footnotes-ൽ 80 വരിയിൽ : bad argument #1 to 'ipairs' (table expected, got nil) 2003 ജനുവരിയിൽ ഒരു പരിഷ്കരിച്ച പതിപ്പ് ഹാസ്കൽ 98 ലാംഗ്വേജ് ആൻഡ് ലൈബ്രറീസ് ആയി പ്രസിദ്ധീകരിച്ചു: പരിഷ്കരിച്ച ഒരു റിപ്പോർട്ട്ലുവ പിഴവ് ഘടകം:Footnotes-ൽ 80 വരിയിൽ : bad argument #1 to 'ipairs' (table expected, got nil) നിലവിലെ ഡേറ്റാ സ്റ്റാൻഡേർഡ് നിലവാരത്തെ പ്രതിനിധാനം ചെയ്യുന്ന ഗ്ലാസ്ഗോ ഹാസ്കൽ കംപൈലർ (ജിഎച്ച്സി) നടപ്പിലാക്കിക്കൊണ്ട് ഭാഷ അതിവേഗം വികസിച്ചുകൊണ്ടിരിക്കുന്നു.[28]
2006-ന്റെ തുടക്കത്തിൽ, ഹാസ്കൽ പ്രൈം എന്നറിയപ്പെട്ടിരുന്ന ഹാസ്കൽ 98 മാനകത്തിലേക്ക് ഒരു പിൻഗാമിയെ നിർവ്വചിച്ചുകൊണ്ടുള്ള ഒരു പ്രക്രിയ ആരംഭിച്ചു.[29] ഭാഷ നിർവചനം പുനഃപരിശോധിക്കുന്നതിനുള്ള തുടർ വർദ്ധന പ്രക്രിയയൊഴിച്ച്, പ്രതിവർഷം ഒരു തവണ ഒരു പുതിയ പരിഷ്ക്കരണം നടത്തുക എന്ന ലക്ഷ്യമായിരുന്നു ഇതിനുണ്ടായിരുന്നത്. 2009 നവംബറിൽ ഹാസ്കൽ 2010 എന്നു പേരുള്ള ആദ്യത്തെ പുനരവലോകനം പ്രഖ്യാപിച്ചു. 2010 ജൂലൈയിൽ ഇത് പ്രസിദ്ധീകരിച്ചു.
ഹാസ്കൽ 2010 ഭാഷക്ക് ഒരു പുരോഗമന അപ്ഡേറ്റ് ഉണ്ട്, വളരെയധികം നന്നായി ഉപയോഗപ്പെടുത്തിക്കൊണ്ടുള്ളതാണ്, കംപൈലർ നിർദ്ദിഷ്ട ഫ്ലാഗുകൾ വഴി സാധ്യമാക്കിയ വിവാദപരമല്ലാത്ത സവിശേഷതകളും ഉൾപ്പെടെ.
List
എന്നതിന് പകരമായിData.List
), സാങ്കേതികമായി മൊഡ്യൂളുകൾ ഉണ്ടെങ്കിലും, എക മോണോലിതിക്ക് നെയിംസ്പേസായി തുടരുന്നു. ഈ വിപുലീകരണം ഹാസ്കൽ 98-ന് അനുബന്ധമായി നൽകിയിരുന്നു, സാർവത്രികമായി അത് ഉപയോഗിച്ചിരുന്നു.(n + 1) = (n + 1) * factn
)വസ്തുതാ നിർവചനങ്ങൾ അനുവദനീയമല്ല. (+)
ഓപ്പറേറ്റർ കോഡ് ഉപയോഗിച്ചു, ഈ വാക്യഘടനാപരമായ ഷുഗർ സെമൻറിക്സിനെ വഴിതെറ്റിക്കുകയുണ്ടായി, എന്നാൽ വാസ്തവത്തിൽ (-),(> =)
എന്നീ കോഡുകളുപയോഗിച്ച് ഡീഷുഗർ ചെയ്തു.LANGUAGE
പ്രാഗ്മാ വ്യക്തമാക്കി. 2010 ആയപ്പോഴേക്കും ഭാഷയി ലേക്കുള്ള ഡസൻ കണക്കിന് വിപുലീകരണങ്ങൾ വ്യാപകമായി ഉപയോഗിക്കപ്പെട്ടു, ജി.എച്ച്.സി (മറ്റ് കമ്പൈലറുകൾക്കിടയിൽ) ഐഡൻറിഫയറുകളുടെ ലിസ്റ്റിനൊപ്പം വ്യക്തിഗത വിപുലീകരണങ്ങളെ വ്യക്തമാക്കാൻ LANGUAGE
പ്രാഗ്മാ നൽകി. Haskell2010
എക്സ്റ്റൻഷൻ പിന്തുണയ്ക്കുന്നതിനായി ഹാസ്കൽ 2010 കമ്പൈലറുകൾ ആവശ്യമാണ്, ഹാസ്കൽ 2010 ൽ ചേർത്തിട്ടുള്ള എക്സ്റ്റെൻഷനുകൾക്ക് അനുബന്ധമായ മറ്റു അനവധി കാര്യങ്ങളെ പിന്തുണയ്ക്കാൻ പ്രോത്സാഹിപ്പിച്ചു.അലസത മൂല്യനിർണ്ണയം, പാറ്റേൺ പൊരുത്തപ്പെടുത്തൽ, ലിസ്റ്റ് ഗ്രഹിക്കൽ, ടൈപ്പ് ക്ലാസസ്, ടൈപ്പ് പോളിമെറിസം എന്നിവയാണ് ഹാസ്ക്കലിൻറെ പ്രത്യേകതകൾ. ഇത് പൂർണ്ണമായ ഭാഷയാണ്, അതിനർത്ഥം പ്രവർത്തനം സാധാരണയായി പാർശ്വഫലങ്ങൾ ഉണ്ടാകില്ല എന്നാണ്. പാർശ്വഫലങ്ങൾ പ്രതിനിധീകരിക്കുന്നതിന് ഒരു പ്രത്യേക നിർമ്മിതി ഉണ്ട്, പ്രവർത്തനരീതികളുടെ തരം ഓർത്തോഗാനൽ ആണ്. ശുദ്ധമായ പ്രവർത്തനം ഫലപ്രദമായി നടപ്പാക്കാൻ കഴിയുന്ന പാർശ്വഫലങ്ങൾ, മറ്റ് ഭാഷകളിലെ ഇംപ്യൂവർ പ്രവർത്തനങ്ങളെ മാതൃകയാക്കാൻ കഴിയും. ഹിൽ-മിൽനർ തരത്തിലുള്ള സമ്പർക്കമുഖത്തെ ആസ്പദമാക്കിയുള്ള ശക്തമായ ഒരു സ്റ്റാറ്റിക് സംവിധാനമാണ് ഹാസ്കെലിന് ഉള്ളത്. എന്നാൽ കൂടുതൽ ഉപയോഗങ്ങൾ കണ്ടെത്തിയതിന് ശേഷം,[30] ഈ ഏരിയിലെ പ്രധാന ആധുനികവത്കരണം, ടൈപ്പ് ക്ലാസ്സുകളാണ്, യഥാർത്ഥത്തിൽ ഭാഷയിലേക്ക് ഓവർലോഡിംഗ് ചേർക്കുന്ന തത്ത്വചിന്തയായിട്ടാണ് ആദ്യം രൂപകൽപ്പന ചെയ്തിരിക്കുന്നത്.[31]
പാർശ്വഫലങ്ങളെ പ്രതിനിധീകരിക്കുന്ന ഘടന മൊനാർഡിൻറെ ഒരു ഉദാഹരണമാണ്. പിശക് കൈകാര്യം ചെയ്യൽ, നോൺഡെറ്റർമിനിസം, പാഴ്സിങ്, സോഫ്റ്റ്വേർ ട്രാൻസാക്ഷണൽ മെമ്മറി എന്നിവയുൾപ്പെടെ വ്യത്യസ്ത തരത്തിലുള്ള കംപ്യൂട്ടിംഗ് രീതികളെ രൂപകൽപ്പന ചെയ്യാൻ കഴിയുന്ന, മൊനാർഡ് ഒരു പൊതു ചട്ടക്കൂടാണ്. മോനാർഡുകൾ സാധാരണ ഡാറ്റാടൈപ്പുകളായി നിർവചിക്ക പ്പെട്ടിട്ടുണ്ട്, എന്നാൽ അവയുടെ ഉപയോഗത്തിനായി ഹാസ്കെൽ ചില സിന്തറ്റിക്ക് ഷുഗർ നൽകുന്നു.
ഹാസ്കലിന് തുറന്ന, പ്രസിദ്ധീകരിച്ച സ്പെസിഫിക്കേഷൻ ഉണ്ട്,ലുവ പിഴവ് ഘടകം:Footnotes-ൽ 80 വരിയിൽ : bad argument #1 to 'ipairs' (table expected, got nil) ഒന്നിലധികം നടപ്പിലാക്കലുകൾ ഉണ്ട്. അതിൻറെ പ്രധാന നിർവ്വഹണം, ഗ്ലാസ്ഗോ ഹാസ്കൽ കംപൈലർ (ജിഎച്ച്സി), മിക്ക പ്ലാറ്റ്ഫോമുകളിലും പ്രവർത്തിക്കുന്ന ഒരു ഇൻറർപ്രട്ടർ, നേറ്റീവ്-കോഡ് കമ്പൈലർ എന്നിവ രണ്ടും. അടുത്തിടെയുള്ള കണ്ടുപിടിത്തങ്ങൾ സംയോജിപ്പിച്ച് ജിഎച്ച്സി അതിൻറെ റിച്ച് ടൈപ്പ് സംവിധാനം ശ്രദ്ധേയമാണ്, പൊതുവായുള്ള ബീജഗണിത ഡാറ്റ തരങ്ങൾ പോലുള്ള ഫാമിലികളെ ടൈപ്പ് ചെയ്യുന്നു. കമ്പ്യൂട്ടർ ഭാഷാ ബെഞ്ച്മാർക്കുകളുടെ ഗെയിം അതിൻറെ ഉയർന്ന പ്രകടനവും സഹവർത്തിത്വവും സമാന്തരത്വവും ഉയർത്തിക്കാട്ടുന്നു.[32]
സജീവമായി വളരുന്ന ഒരു സമൂഹം ഭാഷയ്ക്കിടെയുണ്ട്, 5,400 മൂന്നാം കക്ഷി ഓപ്പൺ സോഴ്സ് ലൈബ്രറികളും ഉപകരണങ്ങളും ഓൺലൈൻ പാക്കേജ് റിപ്പോസിറ്ററിയായ ഹാക്കേജിൽ ലഭ്യമാണ്.
ഹാസ്കലിൽ പ്രവർത്തിക്കുന്ന ഒരു "ഹലോ വേൾഡ്" പ്രോഗ്രാം:
module Main where
main :: IO ()
main = putStrLn "Hello, World!"
ഹാസ്കലിൽ ഫാക്റ്റോറിയൽ ഫംഗ്ഷൻ, കുറച്ച് വ്യത്യസ്ത രീതിയിൽ നിർവചിക്കപ്പെടുന്നു. (തരം വ്യാഖ്യാനം ഓപ്ഷണലാണ്):
-- Type annotation (optional, same for each implementation)
factorial :: (Integral a) => a -> a
-- Using recursion (with the "ifthenelse" expression)
factorial n = if n < 2
then 1
else n * factorial (n - 1)
-- Using recursion (with pattern matching)
factorial 0 = 1
factorial n = n * factorial (n - 1)
-- Using recursion (with guards)
factorial n
| n < 2 = 1
| otherwise = n * factorial (n - 1)
-- Using a list and the "product" function
factorial n = product [1..n]
-- Using fold (implements "product")
factorial n = foldl (*) 1 [1..n]
-- Point-free style
factorial = foldr (*) 1 . enumFromTo 1
ഇൻഫിനിറ്റ് ലിസ്റ്റായി ഫിബൊനാൻസി നമ്പറുകൾ ഫലപ്രദമായി നടപ്പിലാക്കുക:
-- Type annotation (optional, same for each implementation)
fib :: Int -> Integer
-- With self-referencing data
fib n = fibs !! n
where fibs = 0 : scanl (+) 1 fibs
-- 0,1,1,2,3,5,...
-- Same, coded directly
fib n = fibs !! n
where fibs = 0 : 1 : next fibs
next (a : t@(b:_)) = (a+b) : next t
-- Similar idea, using zipWith
fib n = fibs !! n
where fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
-- Using a generator function
fib n = fibs (0,1) !! n
where fibs (a,b) = a : fibs (b,a+b)
ഇൻറ് ടൈപ്പ് ഒരു മെഷീൻ വലിപ്പത്തിലുള്ള ഒരു പൂർണ്ണസംഖ്യയെ (ഇത് !! ഓപ്പറേറ്ററുള്ള ഒരു ലിസ്റ്റ് സബ്സ്ക്രിപ്റ്റ് ആയി ഉപയോഗിച്ചു) സൂചിപ്പിക്കുമ്പോൾ, ഇൻറിജർ ഏകപക്ഷീയമായ ഒരു പൂർണ്ണസംഖ്യയാണ്. ഉദാഹരണമായി, ഇൻറിജർ(integer) ഉപയോഗിച്ച്, മുകളിലുള്ള ഫാക്റ്റോറിയൽ കോഡ് എളുപ്പം കണക്കുകൂട്ടുന്നു factorial 100000
456,574 അക്കങ്ങളുടെ എണ്ണം, കൃത്യമായ നഷ്ടം ഇല്ലാതെ.
ദ്രുത സ്രോതസ്സുകളുൾപ്പെടെയുള്ള ഒരു അൽഗോരിതം നടപ്പിലാക്കുക, പിവറ്റ് ആകുന്ന ആദ്യത്തെ ഘടകം:
-- Type annotation (optional, same for each implementation)
quickSort :: Ord a => [a] -> [a]
-- Using list comprehensions
quickSort [] = [] -- The empty list is already sorted
quickSort (x:xs) = quickSort [a | a <- xs, a < x] -- Sort the left part of the list
++ [x] ++ -- Insert pivot between two sorted parts
quickSort [a | a <- xs, a >= x] -- Sort the right part of the list
-- Using filter
quickSort [] = []
quickSort (x:xs) = quickSort (filter (<x) xs)
++ [x] ++
quickSort (filter (>=x) xs)
ലിസ്റ്റുചെയ്ത നടപ്പിലാക്കൽ എല്ലാം ഓപ്പൺ സോഴ്സ് ലൈസൻസിലൂടെ വിതരണംചെയ്യുന്നു.[33]
ഹാസ്കൽ 98 സ്റ്റാൻഡേർഡുമായി പൂർണമായും യോജിക്കുന്ന നടപ്പിലാക്കൽ, താഴെ പറയുന്നവ ഉൾക്കൊള്ളുന്നു:
ഇനിമേൽ തുടർച്ചയായുള്ള പ്രവർത്തനങ്ങൾ ഇനി പറയുന്നവയല്ല:
പൂർണ്ണമായി നടപ്പിലാക്കാൻ മാത്രം ഹാസ്കെൽ 98 ഒതുക്കമുള്ളതല്ല, കൂടാതെ ഒരു വ്യത്യാസമില്ലാതെ ഒരു ഭൗതിക ഹാസ്കെൽ ഭാഷ ഉപയോഗം, ഇതിൽ ഉൾപ്പെടുന്നു:
ഹാസ്കൽ വെബ് ചട്ടക്കൂടുകൾ നിലവിലുള്ളവ, [47] താഴെ ചേർക്കുന്നു:
2002 ൽ ജാൻ വില്ലം മസെൻ, സൈമൺ പേസ്റ്റൺ ജോൺസ് എന്നിവർ, അലസ വിലയിരുത്തലുകളുമായി ബന്ധപ്പെട്ട പ്രശ്നങ്ങൾ ചർച്ചചെയ്തിനുപുറമെ, അതിനെ സംബന്ധിച്ചുള്ള സൈദ്ധാന്തികമായ ഉദ്ദേശ്യങ്ങൾ അംഗീകരിക്കുമ്പോൾ,[49][50]പ്രായോഗിക പരിഗണനയ്ക്ക് പുറമെ മെച്ചപ്പെട്ട പ്രകടനം പോലുള്ളവയെ പ്പറ്റിയും ചർച്ച ചെയ്തു. അവർ ശ്രദ്ധിക്കുന്നത്, ചില പ്രവർത്തന പരിധികൾ ചേർക്കുന്നതിനൊപ്പം, അലസ മൂല്യനിർണ്ണയം മൂലം പ്രോഗ്രാമ്മർമാർ അവരുടെ കോഡിൻറെ (പ്രത്യേകിച്ച് അതിൻറെ സ്പേസ് ഉപയോഗം) പ്രവർത്തനത്തെക്കുറിച്ച് ചിന്തിക്കാൻ കൂടുതൽ പ്രയാസകരമാക്കുന്നു.
2003 ൽ ബാസ്രിയൻ ഹെരെൻ, ദാൻ ലീജീൻ, അർജൻ വാൻ ഇജെജെൻഡോൺ എന്നിവർ ഹാസ്കൽ പഠിതാക്കൾക്ക് അനുഭവപ്പെടുന്ന ചില തടസ്സങ്ങൾ കണ്ടു: "ഹാസ്കലിൻറെ നിഗൂഡമായ സിൻറാക്സും സങ്കീർണമായ തരം സിസ്റ്റവും, ഇരുവശവും മൂർച്ചയുള്ള വാളിനു തുല്യമാണ്. പരിചയസമ്പന്നരായ പ്രോഗ്രാമർമാർ അതിയായി വിലമതിക്കുന്നു എന്നാൽ തുടക്കക്കാർക്കിടയിൽ നിരാശയുടെ ഉറവിടമായാണ് അനുഭവപ്പെടുന്നത്, ഹാസ്കലിൻറെ സാമാന്യസ്വഭാവം പലപ്പോഴും ഗൂഢമായ പിശക് സന്ദേശങ്ങളിലേക്ക് നയിക്കുന്നു."[51]ഇതു പരിഹരിക്കുന്നതിനായി, ഉത്രെചത്ത് യൂണിവേഴ്സിറ്റിയിലെ ഗവേഷകർ ഹീലിയം എന്ന പേരുള്ള വിപുലമായ ഇൻറർപ്രെട്ടർ വികസിപ്പിച്ചെടുത്തു, പിശക് സന്ദേശങ്ങളുടെ ഉപയോക്തൃ-സൗഹൃദം മെച്ചപ്പെടുത്തുകയും, ചില ഹാസ്കൽ സവിശേഷതകളുടെ സാമാന്യത്വം പരിമിതപ്പെടുത്തിയെടുക്കുകയും ചെയ്തു, പ്രത്യേകിച്ച് ടൈപ്പ് ക്ലാസ്സുകൾക്കുള്ള പിന്തുണ നീക്കം ചെയ്യുക.
ബെൻ ലിപ്മീയർ ആണ് ഡിസിപ്പിൾ(Disciple) രൂപകൽപ്പന ചെയ്തത്[52]ഒരു ടൈപ് എഫക്ട് സിസ്റ്റം ഉപയോഗിച്ച് ഹാസ്കലിൻറെ ഒരു കർശനമായി നിർബന്ധമായും (അലസമായ വ്യാഖ്യാനം വഴി), അലസമായ മൂല്യനിർണ്ണയത്തെ ക്കുറിച്ചുള്ള ന്യായവാദത്തിൽ ഹാക്കസിൻറെ ബുദ്ധിമുട്ടുകൾ പരിഹരിക്കുക, മ്യൂട്ടബിൾ അറേകൾ പോലെയുള്ള പരമ്പരാഗത ഡാറ്റാഘടനകൾ ഉപയോഗിക്കുക തുടങ്ങിയവ.[53]"വിനാശകരമായ അപ്ഡേറ്റ് തയ്യാറാക്കുന്നു" (പേജ് 20) അദ്ദേഹം വാദിക്കുന്നു, പ്രോഗ്രാമർമാർക്ക് പ്രധാനപ്പെട്ട രണ്ട് ശക്തമായ ഉപകരണങ്ങൾ ഉപയോഗിച്ച് ... വസ്തുക്കളുടെ ശേഖരണം നിയന്ത്രിക്കുന്നതിനുള്ള കാര്യക്ഷമമായ അറേ-ഡാറ്റ ഡാറ്റാ സ്ട്രക്ച്ചറുകൾ, ഒപ്പം ... ഒരു പ്രോഗ്രാമിൻറെ എല്ലാ ഭാഗങ്ങളിലും ഒരു പുതിയ മൂല്യം പ്രക്ഷേപണം ചെയ്യാനുള്ള കഴിവ് മുതലായവയിൽ പ്രോഗ്രാമർമാർക്ക് കുറഞ്ഞ പ്രയത്നം മാത്രമെ ഇതിനാവശ്യമായി വരുന്നുള്ളു.
സ്റ്റാൻഡേർഡ് എംഎൽ(ML) എഴുത്തുകാരനായ റോബർട്ട് ഹാർപ്പർ, ആമുഖ പ്രോഗ്രാമിങ് പഠിപ്പിക്കുന്നതിനായി ഹാസ്കൽ ഉപയോഗിക്കാത്തതിൻറെ കാരണം ചൂണ്ടിക്കാണിക്കുന്നു. മൗലികമായ വിലയിരുത്തലുകൾ, ഡാറ്റ തരങ്ങളുടെ നിർവ്വചനം, ഇൻഡക്റ്റീവ് ന്യായവാദം, എന്നിവയിൽ ഉറവിട ഉപയോഗത്തെക്കുറിച്ച് ന്യായവാദം ചെയ്യുന്നത് ബുദ്ധിമുട്ടുള്ള കാര്യമാണ്.[54]എംഎലിൻറെ മൊഡ്യൂൾ സിസ്റ്റവുമായി താരതമ്യപ്പെടുത്തുമ്പോൾ ഹാസ്കലിൻറെ (പഴയ) ക്ലാസ് സിസ്റ്റം "തരംതാണത്" ആണ്.[55]സ്ഥിരം ബിൽഡ്ടൂളായ കാബൽ(Cabel) ഒരു പ്രത്യേക ലൈബ്രറിയുടെ വ്യത്യസ്ത പതിപ്പുകളുടെ നല്ല മാനേജ്മെൻറ് അഭാവത്തിൽ ഡെവലപ്പർമാരുടെ ഇടയിൽ ഇത് നിരന്തരം വിമർശിക്കപ്പെട്ടു. സ്റ്റാക്കിൻറെ പ്രകാശനം വഴി ഇത് പരിഹരിക്കപ്പെട്ടിരിക്കുന്നു. എന്നാൽ സ്വതേയുള്ള ബിൽഡ് ഉപകരണമായി കാബൽ ഇപ്പോഴും ലഭ്യമാക്കുന്നു.
ക്ലീൻ എന്നത് ഹാസ്കലിൻറെ ഏറ്റവും അടുത്ത ബന്ധമുള്ള ഭാഷയാണ്. I / O, സൈഡ് ഇഫക്റ്റുകൾ എന്നിവയ്ക്കായി മൊനാഡ്സിന് (monads) പകരം ഉപയോഗിക്കുന്നത് ഹാസ്കലിൽ നിന്ന് വലിയ വ്യത്യാസം വരുത്തിയ രൂപമാണ്.
ഹാസ്കൽ പ്രചോദിപ്പിച്ച നിരവധി പരമ്പര ഭാഷകൾ, വ്യത്യസ്ത തരത്തിലുള്ള സംവിധാനങ്ങൾ വികസിപ്പിച്ചെടുത്തിട്ടുണ്ട്:
ജാവ വെർച്ച്വൽ മെഷീൻ (ജെവിഎം) അടിസ്ഥാനമാക്കിയുള്ളവ:
മറ്റ് ബന്ധപ്പെട്ട ഭാഷകൾ ഉൾപ്പെടുന്നവ താഴെ പറയുന്നവയാണ്:
ഭാഷാ രൂപകൽപ്പനയിൽ നിരവധി പുതിയ ആശയങ്ങൾ പരീക്ഷിച്ചറിയാൻ ഹാസ്കെൽ സഹായിച്ചിട്ടുണ്ട്. നിരവധി ഹാസ്കൽ വകഭേദങ്ങൾ സൃഷ്ടിച്ചിട്ടുണ്ട്, പുതിയ ഭാഷാ ആശയങ്ങൾ പര്യവേക്ഷണം ചെയ്യൽ മുതലായവ:
ഹാസ്കൽ സമൂഹം പതിവായി ഗവേഷണ-വികസന പ്രവർത്തനങ്ങൾ നിർവഹിക്കുന്നു. പ്രധാന സംഭവങ്ങൾ ഇവയാണ്:
2006 മുതൽ പരമ്പര ഭാഷാ ഉപകരണങ്ങളും ലൈബ്രറികളും മെച്ചപ്പെടുത്തുന്നതിനായുള്ള സംഘടിപ്പിക്കുന്ന ഹാക്കത്തൺ പരമ്പരയാണ് ഹാക്ക്(HAC)പരമ്പര.[64]
ഹാസ്കൽ ഡൊമെയ്നുകളെ (തരം) പെരുമാറ്റവും (ടൈപ്പ് ക്ലാസുകൾ) ഹാസ്കൽ അടിസ്ഥാന ലൈബ്രറിയുടെ സ്റ്റാൻഡേർഡ് ടൈപ്പ്ക്ലാസ്സുകൾക്ക് അടിവരയിടുന്ന ബീജഗണിത ലോകവുമായി നിങ്ങൾക്ക് ആശയവിനിമയം നടത്താം.
നം ക്ലാസ്സുകൾ റിംഗിനു വേണ്ടി ആവശ്യമുള്ള ഓപ്പറേഷൻ സിഗ്നേച്ചറുകളാണുള്ളത്, (+) ഉം (*) ന്യൂട്രൽ ഘടകങ്ങളും ഒഴികെ, ഇത് ലിറ്ററലുകളെ മുൻകൂട്ടി നിശ്ചയിച്ചിരിക്കുന്നു.[65]
ഓപ്പറേഷൻ നിയമങ്ങൾ (+), (*) സഹവർത്തിത്വവും കൂട്ടിച്ചേർക്കലുകളും കൂട്ടിച്ചേർത്തത് ടൈപ്പുകൾ തിരുത്തുകയല്ല, മറിച്ച് തെളിവുകൾ പരിശോധിക്കുകയാണ്.
$ ghci
Prelude> :type 0
0 :: Num a => a -- 0 belongs to any type that has a Num instance, a Ring
Prelude> :type 1
1 :: Num a => a -- neutral for the product of a type that implements Num
വേഡ് ഡാറ്റ ടൈപ്പുകൾ (വേഡ്, വേഡ് എൻ(WordN)) നം ടൈപ്പ് ക്ലാസ് മോഡുലാർ അരിത്മെറ്റിക് ഉപയോഗിച്ച് നടപ്പിലാക്കുന്നു. ഡാറ്റ ടൈപ്പുകളും Int, IntN-ൻറെ ദ്വിമാന സങ്കലനങ്ങളുപയോഗിച്ച് ദശാംശ ഗണിതവുമായി പൊരുത്തപ്പെടുന്നില്ല (ഇൻറിജർ ഓവർഫ്ലോ കാണുക):
Prelude> (signum maxBound ::Int) == signum (maxBound +1)
False -- ??? maxBound successor doesn't obey arithmetic rule (it doesn't throw exceptions)
Prelude> (signum maxBound ::Int) == signum (maxBound *2)
False -- ??? Int product overflow (no exceptions either)
Prelude> (-minBound ::Int) /= minBound -- where Int minBound == sign bit set followed by zeros
False -- ??? Negate overflow
സാധ്യമായ കാര്യപരിവർത്തനം, അത് ക്രമീകൃതമായ അരിത്തമെറ്റിക് ഉപയോഗിച്ച് പൊരുത്തപ്പെടുത്തുന്നത് വഴി ഓവർഫ്ലോയിൽ ഒരു ഒഴിവുകഴിവ് നടത്തി.
പ്രാരംഭ തരം വർഗം റസിപ്പിങ് ഫംഗ്ഷനിൽ ഗുണിത വിപരീതം ("പരോക്ഷമായ") എന്നതിനൊപ്പം അതിൻറെ അനന്തരഫലമായി ഡിവിഷൻ ചേർക്കുന്നു. അത് ഒരു ഫീൽഡിനോട് യോജിക്കുന്നു.[68]
റിയൽ ടൈപ്പ് ക്ലാസിക്ക് നമ്പരും ഓർഡും(ord) ആവശ്യമാണ്. ഓർഡഡ് റിങിന് അനുരൂപമായിരിക്കണം,[69] ഇത് പൂർണ്ണ സംഖ്യയും റാഷണലും നൽകുന്നു.[70] കൂടാതെ ഫ്ലോട്ടിംഗ് പോയിൻറ് നമ്പറുകൾ കൂടി നൽകുന്നു.[71]
യൂക്ലിഡിയൻ ഡിവിഷനിലെ പ്രവർത്തനങ്ങൾക്ക് ഇൻറഗ്രൽ ടൈപ്പ് ക്ലാസ് ഒരു യൂക്ലിഡിയൻ റിംഗുമായി യോജിക്കുന്ന റിയൽ, ഈനമും ക്ലാസുകൾക്ക് പ്രവർത്തനങ്ങൾ കൂട്ടിച്ചേർക്കുന്നു.[72]
ഫ്ലോട്ടിംഗ് ടൈപ്പ് ക്ലാസ് ഫ്ലോറാൽ ഫങ്ഷണൽ കാൽക്യുസ് ഫങ്ഷനുകൾ (sqrt, ട്രൈക്കോണിമെട്രിക് ഫംഗ്ഷനുകൾ, ലോഗരിതങ്ങൾ) ഫ്ലോട്ടിംഗ് പോയിൻറ് (ഫ്ലോട്ട്, ഡബിൾ), സങ്കീർണ്ണ സംഖ്യകൾ എന്നിവയിലേയ്ക്ക് ചേർക്കുന്നു[73][71][74] എക്സ്പോണനേഷൻ മൂന്ന് ഫ്ളേവറുകളിൽ വരുന്നു:
(^) :: (Num a, Integral ex) => a -> ex -> a -- (^) admits non-negative exponents of an euclidean domain, throws an error if the exponent is negative
(^^) :: (Fractional a, Integral ex) => a -> ex -> a -- (^^) admits all exponents of an euclidean domain
(**) :: (Floating a, Floating ex) => a -> ex -> a
യൂക്ലിഡിയൻ തരങ്ങൾ തമ്മിലുള്ള പരിവർത്തനങ്ങൾ പ്രതിനിധാനം ചെയ്യുന്നത്, മൂല്യം അല്ല. ന്യൂമെറിക്കൽ ടൈപ്പ് ക്ലെയിമിൽ ഓവർഫ്ലോ ഒഴിവാക്കില്ല:
$ ghci
Prelude> import Data.Int
Prelude Data.Int> fromIntegral (32767 :: Int16) :: Int8
-1
Prelude Data.Int> fromInteger (2^64 :: Integer) :: Int32
0
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.