හැස්කල් වර්ගයේ පද්ධතිය එතරම් ගෞරවයට පාත්‍ර වන්නේ කුමක් නිසාද?


210

මම හස්කල් ඉගෙන ගන්න පටන් ගන්නවා . මම එයට ඉතා අළුත් වන අතර, මම එහි මූලික සැකැස්ම වටා මගේ හිස ලබා ගැනීම සඳහා සබැඳි පොත් කිහිපයක් කියවමි.

හුරුපුරුදු පුද්ගලයින් බොහෝ විට කතා කර ඇති 'මේම්ස්' වලින් එකක් නම්, සමස්තය "එය සම්පාදනය කළහොත් එය ක්‍රියාත්මක වනු ඇත *" දෙයයි - මා සිතන්නේ එය වර්ග පද්ධතියේ ශක්තියට සම්බන්ධ බවයි.

මම ඇයි තේරුම් ගැනීමට උත්සාහ කරනවා හරියටම Haskell මේ සම්බන්ධයෙන් අනෙකුත් statically ටයිප් භාෂා වඩා හොඳයි.

තවත් ක්‍රමයක් කියන්න, මම ජාවාහි උපකල්පනය කරමි, ඔබට ArrayList<String>()ඇත්ත වශයෙන්ම තිබිය යුතු යමක් අඩංගු කර ගැනීම සඳහා භූමදාන කිරීම වැනි දරුණු දෙයක් කළ හැකිය ArrayList<Animal>(). මෙහි ඇති භයානක දෙය නම් ඔබේ stringඅඩංගු දෑ elephant, giraffeයනාදිය යනාදිය යමෙකු ඇතුලත් කරන්නේ නම් Mercedes- ඔබේ සම්පාදකයා ඔබට උදව් නොකරනු ඇත.

මම නම් කළේ නැහැ ArrayList<Animal>()කාලය තුළ සමහර පසුව අවස්ථාවක දී, එසේ නම්, මම මගේ වැඩ ඇත්තටම සතුන් ගැන නොවේ, එය වාහන ගැන දෙයක් තීරණය කරනවා නම්, එවිට මම, නිෂ්පාදනය කරන කාර්යය වෙනස් කළ හැකිය කියන්නේ, ArrayList<Animal>නිෂ්පාදනය කිරීමට ArrayList<Vehicle>සහ මගේ IDE මට සෑම තැනකම ඇති කියන්න ඕන සම්පාදක විවේකයක්.

මගේ උපකල්පනය නම් මෙය ශක්තිමත් වර්ගයේ ක්‍රමයක් මගින් මිනිසුන් අදහස් කරන බවයි , නමුත් හස්කල් වඩා හොඳ වන්නේ මන්දැයි මට පැහැදිලි නැත. වෙනත් ක්‍රමයක් තබන්න, ඔබට හොඳ හෝ නරක ජාවා ලිවිය හැකිය, මම හිතන්නේ ඔබටත් එය හස්කල්හි කළ හැකිය (එනම් දේවල් පළමු පන්තියේ දත්ත වර්ග විය යුතු නූල් / අඟල් වලට ඇතුල් කරන්න).

මට වැදගත් / මූලික දෙයක් මග හැරී ඇතැයි මම සැක කරමි.
මගේ මාර්ගවල වැරැද්ද පෙන්වීම ගැන මම ඉතා සතුටු වෙමි!


32
මම සැබෑ පිළිතුරු ලිවීමට වඩා දැනුමක් ඇති අයට මම ඉඩ දෙන්නෙමි, නමුත් එහි සාරාංශය මෙයයි: C # වැනි ස්ථිතිකව ටයිප් කළ භාෂාවන්ට ආරක්ෂිත පද්ධතියක් ලිවීමට ඔබට උදව් කිරීමට උත්සාහ කරන ආකාරයේ පද්ධතියක් ඇත ; නිවැරදි (එනම් ඔප්පු කළ හැකි) කේතයක් ලිවීමට ඔබට උදව් කිරීමට හස්කල්ගේ උත්සාහය වැනි පද්ධති ටයිප් කරන්න . කාර්යයේ මූලික මූලධර්මය වන්නේ සංයුක්ත අවධියට පරීක්ෂා කළ හැකි දේවල් ගෙනයාමයි; සම්පාදනය කරන වේලාවේදී හස්කල් තවත් බොහෝ දේ පරික්ෂා කරයි.
රොබට් හාවි

8
මම හස්කල් ගැන වැඩි යමක් නොදන්නා නමුත් මට ජාවා ගැන කතා කළ හැකිය. එය තදින් ටයිප් කළ බවක් පෙනෙන්නට තිබුණද , එය ඔබ කී පරිදි "දරුණු" දේවල් කිරීමට තවමත් ඉඩ දෙයි. ජාවා එහි වර්ගයේ පද්ධතිය සම්බන්ධයෙන් කරන සෑම සහතිකයක්ම පාහේ, ඒ වටා ක්‍රමයක් තිබේ.

13
සියලුම පිළිතුරු Maybeඅවසානය දක්වා පමණක් සඳහන් වන්නේ මන්දැයි මම නොදනිමි . වඩාත් ජනප්‍රිය භාෂාවන් හස්කල්ගෙන් ණයට ගත යුතු එක් දෙයක් පමණක් තෝරා ගැනීමට මට සිදුවුවහොත්, එය එසේ වනු ඇත. එය ඉතා සරල අදහසක් (න්‍යායාත්මක දෘෂ්ටි කෝණයකින් එතරම් සිත්ගන්නා සුළු නොවේ), නමුත් මෙය පමණක් අපගේ රැකියා එතරම් පහසු කරනු ඇත.
පෝල්

1
මෙහි විශාල පිළිතුරු ලැබෙනු ඇත, නමුත් සහාය වීමට උත්සාහ කිරීමේදී, වර්ගයේ අත්සන් අධ්‍යයනය කරන්න. ඔවුන් මිනිසුන්ට සහ වැඩසටහන් වලට වැඩසටහන් ගැන තර්ක කිරීමට ඉඩ සලසයි, එමඟින් ජාවා හතු මැද ප්‍රති: වර්ග වල ආකාරය නිරූපණය කරයි.
මයිකල් පාස්කු

6
සාධාරණත්වය සඳහා මා පෙන්වා දිය යුත්තේ “සමස්තයක් සම්පාදනය කළහොත් එය ක්‍රියාත්මක වනු ඇත” යනු සටන් පා gan යකි. ඔව්, අපි හැස්කෙල් ක්‍රමලේඛකයින් දන්නවා, වර්ග පරීක්ෂකය පසු කිරීම නිවැරදි භාවය පිළිබඳ හොඳ අවස්ථාවක් ලබා දෙන බව.
ටොම් එලිස්

Answers:


235

මෙන්න හස්කල් හි ඇති වර්ගීකරණ පද්ධති විශේෂාංග ලැයිස්තුවක් සහ ජාවා හි ලබා ගත නොහැකි හෝ අඩු ලස්සනයි (මගේ දැනුමට අනුව, එය ජාවාහි දුර්වල බව පිළිගත යුතුය)

  • ආරක්ෂාව . හස්කල්ගේ වර්ගවල හොඳ “වර්ගයේ ආරක්ෂාව” ගුණ ඇත. මෙය බෙහෙවින් නිශ්චිත ය, නමුත් එහි සාරය නම් කිසියම් වර්ගයක අගයන්ට අනවශ්‍ය ලෙස වෙනත් වර්ගයක් බවට පරිවර්තනය කළ නොහැකි බවයි. මෙය සමහර විට විකෘතිතාවයට පටහැනි වේ (OCaml හි අගය සීමා කිරීම බලන්න )
  • වීජීය දත්ත වර්ග . හස්කල් හි වර්ගවල මූලික වශයෙන් උසස් පාසැල් ගණිතයට සමාන ව්‍යුහයක් ඇත. මෙය අතිශය සරල හා ස්ථාවර ය, එහෙත්, පෙනෙන පරිදි, ඔබට අවශ්‍ය තරම් බලවත් ය. එය හුදෙක් වර්ග පද්ධතියක් සඳහා හොඳ පදනමක්.
    • දත්ත සමුදාය-සාමාන්‍ය වැඩසටහන්කරණය . මෙය සාමාන්‍ය වර්ග වලට සමාන නොවේ ( සාමාන්‍යකරණය බලන්න ). ඒ වෙනුවට, කලින් සඳහන් කළ පරිදි වර්ගයේ ව්‍යුහයේ සරල බව නිසා එම ව්‍යුහයට වඩා සාමාන්‍යයෙන් ක්‍රියාත්මක වන කේත ලිවීම සාපේක්ෂව පහසුය. පසුව මම කතා කරන්නේ Eqහැස්කල් සම්පාදකයෙකු විසින් පරිශීලක අර්ථ දක්වන ලද වර්ගයක් සඳහා uality වැනි දෙයක් ස්වයංක්‍රීයව ව්‍යුත්පන්න කරන්නේ කෙසේද යන්න ගැන ය . අත්යවශ්යයෙන්ම මෙය සිදු කරන ආකාරය ඕනෑම පරිශීලක අර්ථ දක්වන ලද වර්ගයකට යටින් පොදු, සරල ව්යුහය හරහා ගමන් කර එය අගයන් අතර ගැලපීමකි. මෙය ඉතා ස්වාභාවික ව්යුහාත්මක සමානාත්මතාවයකි.
  • අන්යෝන්ය පුනරාවර්තන වර්ග . මෙය සුළු නොවන වර්ග ලිවීමේ අත්‍යවශ්‍ය අංගයකි.
    • කැදැලි වර්ග . විවිධ වර්ගවල පුනරාවර්තන විචල්‍යයන්ට වඩා පුනරාවර්තන වර්ග නිර්වචනය කිරීමට මෙය ඔබට ඉඩ සලසයි. උදාහරණයක් ලෙස, සමබර ගස් එක් වර්ගයකි data Bt a = Here a | There (Bt (a, a)). වලංගු අගයන් ගැන හොඳින් සිතා බලා Bt aඑම වර්ගය ක්‍රියාත්මක වන ආකාරය සැලකිල්ලට ගන්න. එය ව්‍යාකූලයි!
  • සාමාන්‍යකරණය . මෙය වර්ග පද්ධතියක නොතිබීමට තරම් මෝඩ වැඩකි (අහ්, ඔබ දෙස බලා, යන්න). වර්ග විචල්‍යයන් පිළිබඳ අදහස් තිබීම වැදගත් වන අතර එම විචල්‍යය තේරීමෙන් ස්වාධීන වන කේත ගැන කතා කිරීමේ හැකියාව ඇත. Hindley Milner පද්ධතිය එෆ් Haskell ගණය පද්ධතිය ව්යුත්පන්න වන වර්ගය පද්ධතිය එච්.එම් ටයිප් ක විස්තාරනය අතර පද්ධතිය එෆ් අවශ්යයෙන්ම ඇත වේ බත බුලතින් පිරි බල කිරීම. මා කීමට අදහස් කරන්නේ හැස්කෙල්ට ඉතා හොඳ සාමාන්‍යකරණ කතාවක් ඇති බවයි.
  • වියුක්ත වර්ග . මෙහි හස්කල්ගේ කතාව විශිෂ්ට නොවේ පමණක් නොව නොපවතී. පොදු අතුරු මුහුණතක් ඇති නමුත් පුද්ගලික ක්‍රියාත්මක කිරීමක් ඇති වර්ග ලිවිය හැකිය. පසුකාලීනව ක්‍රියාත්මක කිරීමේ කේතයේ වෙනස්කම් පිළිගැනීමට මෙය අපට ඉඩ සලසයි. වැදගත් වන්නේ එය හස්කල් හි සියලු ක්‍රියාකාරිත්වයේ පදනම බැවින්, මනාව නිර්වචනය කළ අතුරුමුහුණත් ඇති “මැජික්” වර්ග ලියන්න IO. අවංකව කිවහොත්, ජාවාහි ඇත්තෙන්ම හොඳ වියුක්ත ආකාරයේ කතාවක් ඇත, නමුත් අතුරුමුහුණත් වඩාත් ජනප්‍රිය වන තෙක් එය සත්‍යයක් යැයි මම නොසිතමි.
  • පරාමිතිකතාව . Haskell වටිනාකම් නැහැ ඕනෑම විශ්ව මෙහෙයුම්. ජාවා මෙය උල්ලං lates නය කරන්නේ විමර්ශන සමානාත්මතාවය සහ හැෂිං වැනි දේවලින් සහ ඊටත් වඩා බලහත්කාරයෙන් බලහත්කාරයෙන් ය. මෙහි තේරුම නම්, යම් ආකාරයක මෙහෙයුමක හෝ වටිනාකමේ අර්ථය මුළුමනින්ම එහි වර්ගයට වඩා දැන ගැනීමට ඔබට ඉඩ සලසන වර්ග පිළිබඳ නිදහස් ප්‍රමේයයන් ඔබට ලබා දීමයි --- සමහර වර්ගවල වැසියන් ඉතා සුළු සංඛ්‍යාවක් පමණක් සිටිය හැකි ය.
  • උපක්‍රමශීලී දේවල් කේතනය කිරීමේදී ඉහළ වර්ගයේ වර්ග සියල්ලම පෙන්වයි. Functor / Applicationative / Monad, Foldable / Traversable, සමස්ත mtlප්‍රයෝග ටයිප් කිරීමේ පද්ධතිය, සාමාන්‍යකරණය කරන ලද Functor fixpoints. ලැයිස්තුව දිගින් දිගටම ඉදිරියට යයි. ඉහළ වර්ගවල වඩාත්ම හොඳින් ප්‍රකාශ වන බොහෝ දේ ඇති අතර සාපේක්ෂව වර්ග වර්ග පද්ධති පවා පරිශීලකයාට මේ දේවල් ගැන කතා කිරීමට ඉඩ දෙයි.
  • පන්ති ටයිප් කරන්න . ටයිප් පද්ධති ප්‍රයෝජනවත් යැයි සිතන තාර්කික යැයි ඔබ සිතන්නේ නම්, ඔබ බොහෝ විට ඉල්ලා සිටින්නේ දේවල් ඔප්පු කිරීමට ය. බොහෝ අවස්ථාවන්හීදී මෙය අත්‍යවශ්‍යයෙන්ම රේඛීය ශබ්දය වේ: එකම නිවැරදි පිළිතුරක් තිබිය හැකි අතර මෙය ප්‍රකාශ කිරීමට ක්‍රමලේඛකයාට කාලය හා ශ්‍රමය නාස්තියකි. ටයිප් ක්ලාස් යනු හැස්කෙල්ට ඔබ වෙනුවෙන් සාක්ෂි ජනනය කිරීමේ ක්‍රමයකි. වඩාත් සංක්ෂිප්තව කිවහොත්, "අපි (+)එකට එකතු වීමට අදහස් කරන්නේ කුමන වර්ගයේද? ඔහ් Integer, හරි! දැන් නිවැරදි කේතය පේළි කරමු! " වැනි සරල "වර්ග සමීකරණ පද්ධති" විසඳීමට මෙය ඔබට ඉඩ සලසයි . වඩාත් සංකීර්ණ පද්ධති වලදී ඔබ වඩාත් සිත්ගන්නාසුලු අවහිරතා ඇති කරයි.
    • අවහිරතා ගණනය කිරීම . ටයිප් ක්ලාස් ප්‍රෝග්‍රෑම් පද්ධතියට ලඟා වීමේ යාන්ත්‍රණය වන හස්කල් හි අවහිරතා ව්‍යුහාත්මකව ටයිප් කර ඇත. මෙය ඉතා සරල උප ප්‍රභේද සම්බන්ධතාවයක් ලබා දෙන අතර එමඟින් සරල අයගෙන් සංකීර්ණ බාධක එක්රැස් කිරීමට ඔබට ඉඩ සලසයි. මුළු mtlපුස්තකාලයම මෙම අදහස මත පදනම් වේ.
    • ව්‍යුත්පන්න . ධාවනය කිරීම සඳහා පිළිගත් ග්රන්ථ සමූහයට අයත් වූ typeclass පද්ධතිය එය පරිශීලකයින් අර්ථ වර්ග instantiate යුතු බාධක විස්තර කිරීමට බොහෝ විට සුළු කේතය ගොඩක් ලියන්න අවශ්ය වේ. හැස්කල් වර්ගවල සාමාන්‍ය ව්‍යුහයට කරන්න, බොහෝ විට ඔබ වෙනුවෙන් මෙම බොයිලේරු පුවරුව කිරීමට සම්පාදකයාගෙන් ඉල්ලා සිටිය හැකිය.
    • පන්තියේ prolog ටයිප් කරන්න . මා කලින් සඳහන් කළ “සාක්‍ෂි” ජනනය කරන පද්ධතිය වන හැස්කල් වර්ගයේ පංති විසඳුම, සාරභූත අර්ථකථන ගුණාංග සහිත ප්‍රොග්ලොග් හි අබලන් ආකාරයකි. මෙයින් අදහස් කරන්නේ ඔබට කෙස් කළඹක් සහිත ප්‍රොග්ලොග් ආකාරයෙන් කේතනය කළ හැකි අතර ඒවා සම්පාදනය කරන වේලාවේදී ඒවා හසුරුවනු ඇතැයි අපේක්ෂා කරන බවයි. ඇණවුම ගැන ඔබට අමතක වුවහොත් විෂමජාතීය ලැයිස්තු දෙකක් සමාන බව ඔප්පු කිරීම සඳහා හොඳ උදාහරණයක් විය හැකිය - ඒවා සමාන විෂමජාතීය “කට්ටල” වේ.
    • බහු පරාමිති වර්ග පන්ති සහ ක්‍රියාකාරී පරායත්තතා . මේවා මූලික ටයිප් ක්ලාස් ප්‍රොග්ලොග් සඳහා විශාල වශයෙන් ප්‍රයෝජනවත් වේ. ඔබ Prolog හඳුනන්නේ නම්, ඔබට එක් විචල්‍යයකට වඩා අනාවැකි ලිවිය හැකි විට ප්‍රකාශන බලය කොපමණ වැඩිවේදැයි ඔබට සිතාගත හැකිය.
  • හොඳ නිගමනයකි . හින්ඩ්ලි මිල්නර් වර්ගයේ පද්ධති මත පදනම් වූ භාෂාවන්ට හොඳ අනුමාන කිරීම් ඇත. එච්එම් හි සම්පූර්ණ නිගමනය ඇත, එයින් අදහස් කරන්නේ ඔබ කිසි විටෙකත් වර්ග විචල්‍යයක් ලිවීමට අවශ්‍ය නොවන බවයි. හස්කල්ගේ සරලම ස්වරූපය වන හස්කල් 98 දැනටමත් ඉතා දුර්ලභ අවස්ථාවන්හිදී එය ඉවත දමයි. සාමාන්‍යයෙන්, නූතන හැස්කල් යනු එච්එම් වෙත වැඩි බලයක් එක් කරන අතරම පරිශීලකයින් පැමිණිලි කරන විට දැකීමත් සමඟම සම්පූර්ණ අනුමාන කිරීම් අවකාශය සෙමින් අඩු කිරීමේ අත්හදා බැලීමකි. මිනිසුන් පැමිණිලි කරන්නේ ඉතා කලාතුරකිනි - හස්කල්ගේ අනුමානය ඉතා හොඳයි.
  • ඉතා, ඉතා, ඉතා දුර්වල උප වර්ගයක් පමණි . මා කලින් සඳහන් කළේ ටයිප් ක්ලාස් ප්‍රොග්ලොග් හි අවහිරතා පද්ධතියට ව්‍යුහාත්මක උප වර්ගීකරණය පිළිබඳ සංකල්පයක් ඇති බවයි. හැස්කෙල්හි උප වර්ගීකරණය කිරීමේ එකම ආකාරය එයයි . තර්ක කිරීම සහ අනුමාන කිරීම සඳහා උප වර්ග කිරීම භයානක ය. එමඟින් එම සෑම ගැටලුවක්ම සැලකිය යුතු ලෙස දුෂ්කර කරයි (සමානතා ක්‍රමයක් වෙනුවට අසමානතා පද්ධතියක්). වරදවා වටහා ගැනීමද ඇත්තෙන්ම පහසුය (උප වර්ගීකරණය උප වර්ගීකරණයට සමානද? ඇත්ත වශයෙන්ම නැත! නමුත් මිනිසුන් බොහෝ විට එය ව්‍යාකූල කරන අතර බොහෝ භාෂා එම ව්‍යාකූලත්වයට උපකාරී වේ! අප මෙහි කෙළවර වූයේ කෙසේද? කිසිවෙකු එල්එස්පී පරීක්‍ෂා නොකරයි යැයි සිතමි.)
    • සටහන මෑතකදී (2017 මුල) ස්ටීවන් ඩෝලන් එම්එල්සුබ් පිළිබඳ සිය නිබන්ධනය ප්‍රකාශයට පත් කළේය . එම්එල් සහ හින්ඩ්ලි-මිල්නර් වර්ගයේ අනුමාන කිරීම්වල ප්‍රභේදයක් වන මෙය ඉතා හොඳ උප ප්‍රභේද කතාවක් ඇත ( මෙයද බලන්න ). මෙය මා ඉහත ලියා ඇති දේ නොසලකා හරිනු නොලැබේ - බොහෝ උප වර්ගීකරණ පද්ධති කැඩී ඇති අතර නරක අනුමාන කිරීම් ඇත - නමුත් එයින් ඇඟවෙන්නේ සම්පූර්ණ අනුමාන කිරීම් සහ උප වර්ගීකරණ සෙල්ලම මනාව එකට තබා ගැනීම සඳහා පොරොන්දු වූ ක්‍රම කිහිපයක් අපි අද සොයාගෙන ඇති බවයි. දැන්, සම්පූර්ණයෙන්ම පැහැදිලිව කිවහොත්, ජාවාගේ උප වර්ගීකරණය පිළිබඳ අදහස් කිසිදු ආකාරයකින් ඩෝලන්ගේ ඇල්ගොරිතම සහ පද්ධති වලින් ප්‍රයෝජන ගත නොහැක. උප වර්ගය යනු කුමක්ද යන්න පිළිබඳව නැවත සිතා බැලීම අවශ්‍ය වේ.
  • ඉහළ ශ්‍රේණියේ වර්ග . මම මීට පෙර සාමාන්‍යකරණය ගැන කතා කළෙමි, නමුත් හුදෙක් සාමාන්‍යකරණයට වඩා ඒවා තුළ විචල්‍ය විචල්‍යයන් ඇති වර්ග ගැන කතා කිරීමට හැකිවීම ප්‍රයෝජනවත් වේ . නිදසුනක් ලෙස, ඉහළ පෙළේ ව්‍යුහයන් අතර සිතියම් ගත කිරීම නොසලකා හරින ( පරාමිතිකතාව බලන්න ) එම ව්‍යුහයන් “අඩංගු” දේට සමාන වර්ගයක් (forall a. f a -> g a)ඇත. කෙලින්ම එච්එම් මඟින් ඔබට මෙම වර්ගයේ ශ්‍රිතයක් ලිවිය හැකිය, නමුත් ඉහළ පෙළේ වර්ග සමඟ ඔබ එවැනි ශ්‍රිතයක් තර්කයක් ලෙස ඉල්ලා සිටී : mapFree :: (forall a . f a -> g a) -> Free f -> Free g. බව දැනුම් aවිචල්ය තර්කය තුළ පමණක් බැඳී ඇත. මෙයින් අදහස් කරන්නේ ශ්‍රිතයේ නිශ්චිත තැනැත්තා එය භාවිතා කරන විට ක්ෂණිකව mapFreeකුමක් කළ යුතුද යන්න තීරණය කළ aයුතු mapFreeබවයි.
  • පැවැත්මේ වර්ග . විශ්වීය ප්‍රමාණකරණය ගැන කතා කිරීමට ඉහළ පෙළේ වර්ග අපට ඉඩ දෙන අතර, පැවැත්මේ වර්ග අපට පැවැත්මේ ප්‍රමාණකරණය ගැන කතා කිරීමට ඉඩ දෙයි: සමහර සමීකරණ තෘප්තිමත් කරන කිසියම් නොදන්නා වර්ගයක් පවතින බවට ඇති අදහස . මෙය ප්‍රයෝජනවත් වීම අවසන් වන අතර ඒ ගැන වැඩි වේලාවක් යාමට බොහෝ කාලයක් ගතවනු ඇත.
  • පවුල් ටයිප් කරන්න . අපි සෑම විටම Prolog හි නොසිතන බැවින් සමහර විට යතුරු ලියන යාන්ත්‍රණයන් අපහසු වේ. වර්ග පවුල් අතර සෘජු ක්‍රියාකාරී සම්බන්ධතා ලිවීමට අපට ඉඩ දෙන්න .
    • සංවෘත වර්ගයේ පවුල් . ටයිප් පවුල් පෙරනිමියෙන් විවෘතව ඇති අතර එය කරදරයක් වන අතර එයින් අදහස් කරන්නේ ඔබට ඒවා ඕනෑම වේලාවක දීර් extend කළ හැකි අතර සාර්ථකත්වයේ බලාපොරොත්තුවකින් ඔබට ඔවුන්ව "පෙරළා" ගත නොහැකි බවයි. මෙයට හේතුව ඔබට එන්නත් කිරීම ඔප්පු කළ නොහැකි නමුත් සංවෘත වර්ගයේ පවුල් සමඟ ඔබට හැකි බැවිනි.
  • කරුණාවන්ත සුචිගත වර්ග සහ වර්ග ප්‍රවර්ධනය . මම මේ අවස්ථාවේ දී ඇත්තෙන්ම විදේශීය ය, නමුත් මේවා වරින් වර ප්‍රායෝගික භාවිතයන් ඇත. විවෘත හෝ වසා ඇති හැන්ඩ්ල් වර්ගයක් ලිවීමට ඔබ කැමති නම් ඔබට එය ඉතා හොඳින් කළ හැකිය. පහත දැක්වෙන ස්නිපටයේ Stateඉතා සරල වීජීය වර්ගයක් වන අතර එහි අගයන් වර්ග මට්ටමට උසස් කරන ලදි. එවිට, ඉන් අනතුරුව, අපි ගැන කතා කරන්න බැහැ වර්ගය ඉදිකරන්නන් වැනි Handleවිශේෂිත දී තර්ක ගෙන ලෙස වර්ග වැනි State. සියලු විස්තර තේරුම් ගැනීම අවුල් සහගතය, එසේම එය හරි ය.

    data State = Open | Closed
    
    data Handle :: State -> * -> * where
      OpenHandle :: {- something -} -> Handle Open a
      ClosedHandle :: {- something -} -> Handle Closed a
  • ක්‍රියාත්මක වන ධාවන කාල ආකාරයේ නිරූපණයන් . ජාවා වර්ගයේ මකාදැමීම සහ සමහර පුද්ගලයින්ගේ පෙළපාළි වල වැසි ඇතිවීම පිළිබඳව කුප්‍රකටය. මකාදැමීම යනු නිවැරදි මාර්ගයයි, කෙසේ වෙතත්, ඔබට ශ්‍රිතයක් තිබේ getRepr :: a -> TypeReprනම් ඔබ අවම වශයෙන් පරාමිතිකත්වය උල්ලං late නය කරයි. නරකම දෙය නම්, එය ක්‍රියාකාරී වේලාවේදී අනාරක්ෂිත බලහත්කාරයන් අවුලුවාලීමට භාවිතා කරන පරිශීලක ජනනය කළ ශ්‍රිතයක් නම් ... එවිට ඔබට විශාල ආරක්ෂිත සැලකිල්ලක් ඇත. හස්කල්ගේ Typeableපද්ධතිය මඟින් ආරක්ෂිත ස්ථානයක් නිර්මාණය කිරීමට ඉඩ ලබා දේ coerce :: (Typeable a, Typeable b) => a -> Maybe b. මෙම ක්‍රමය රඳා පවතින්නේ Typeableසම්පාදකයා තුළ (සහ පරිශීලක භූමියේ නොවේ) ක්‍රියාත්මක කිරීම මත වන අතර හස්කල්ගේ ටයිප් ක්ලාස් යාන්ත්‍රණය සහ එය අනුගමනය කිරීමට සහතික කර ඇති නීති නොමැතිව එවැනි හොඳ අර්ථකථන ලබා දිය නොහැක.

කෙසේ වෙතත් මේවාට වඩා හැස්කෙල්ගේ වර්ගයේ පද්ධතියේ වටිනාකම ද භාෂාව විස්තර කරන ආකාරය හා සම්බන්ධ වේ. වර්ග පද්ධතිය හරහා අගය ලබා දෙන හස්කල් හි විශේෂාංග කිහිපයක් මෙන්න.

  • නිර්මලත්වය . "අතුරු ආබාධ" පිළිබඳ ඉතා පුළුල් අර්ථ දැක්වීමක් සඳහා හස්කල් කිසිදු අතුරු ආබාධයකට ඉඩ නොදේ. වර්ග මඟින් යෙදවුම් සහ ප්‍රතිදානයන් පාලනය කරන බැවින් අතුරු තොරතුරු නොමැතිව සෑම දෙයක්ම යෙදවුම් හා ප්‍රතිදානයන් සඳහා ගණනය කළ යුතු බැවින් මෙය වැඩි තොරතුරු වර්ග වලට ඇතුළත් කිරීමට බල කරයි.
    • IO . ඉන් අනතුරුව, Haskell අතුරු ආබාධ-සිට කිසිදු සැබෑ වැඩසටහන ගැන කතා කිරීමට ක්රමයක් සමහර-එසේ typeclasses සංකලනයක් ද ඇතුලත් විය යුතු ය, වැඩි kinded වර්ග, සහ වියුක්ත වර්ග නමින් විශේෂයෙන් ම, සුපිරි විශේෂ ආකාරයේ භාවිතා කිරීමේ සංකල්පය පැන නැගීමට තුඩු දුන් අවශ්ය IO aනියෝජනය කිරීමට වර්ගයේ අගයන් ඇති කරන අතුරු effect ල ගණනය කිරීම් a. පිරිසිදු භාෂාවක් තුළ කාවැදී ඇති ඉතා හොඳ ප්‍රති system ල පද්ධතියක පදනම මෙයයි .
  • හිඟකමnull . nullනූතන ක්‍රමලේඛන භාෂාවල ඩොලර් බිලියනයක වැරැද්ද එය බව කවුරුත් දනිති . වීජීය වර්ග, විශේෂයෙන් පමණක් එකතු කිරීමට හැකියාව රාජ්ය ඔබ වර්ගය බැද ඇති වර්ග මතට "නොපවතියි" Aවර්ගය බවට Maybe A, ඇති ප්රශ්නය සම්පූර්ණයෙන්ම අවම null.
  • බහුමාමක පුනරාවර්තනය . එක් එක් පුනරාවර්තන ඇමතුමක දී ඒවායේ සාමාන්‍යකරණය තුළ විවිධ වර්ගවල ඒවා භාවිතා කර තිබියදීත්, වර්ග විචල්‍යයන් සාමාන්‍යකරණය කරන පුනරාවර්තන කාර්යයන් අර්ථ දැක්වීමට මෙය ඔබට ඉඩ දෙයි. මෙය කතා කිරීම දුෂ්කර නමුත් කූඩු වර්ග ගැන කතා කිරීම සඳහා විශේෂයෙන් ප්‍රයෝජනවත් වේ. පෙර සිට Bt aවර්ගය වෙත ආපසු ගොස් එහි ප්‍රමාණය ගණනය කිරීම සඳහා ශ්‍රිතයක් ලිවීමට උත්සාහ කරන්න : size :: Bt a -> Int. එය ටිකක් වගේ එන්නම් size (Here a) = 1හා size (There bt) = 2 * size bt. ක්‍රියාකාරීව එය එතරම් සංකීර්ණ නොවේ, නමුත් sizeඅවසාන සමීකරණයේ පුනරාවර්තන ඇමතුම වෙනත් වර්ගයක සිදුවන බව සැලකිල්ලට ගන්න , නමුත් සමස්ත අර්ථ දැක්වීම තුළ හොඳ සාමාන්‍යකරණය වූ වර්ගයක් size :: Bt a -> Intඇත. මෙය සම්පුර්ණ අනුමානයන් බිඳ දැමූ අංගයක් බව සලකන්න, නමුත් ඔබ වර්ගයේ අත්සනක් ලබා දෙන්නේ නම් හැස්කෙල් එයට ඉඩ දෙනු ඇත.

මට දිගටම ඉදිරියට යා හැකිය, නමුත් මෙම ලැයිස්තුවෙන් ඔබ ආරම්භ කළ යුතු අතර පසුව සමහරක් විය යුතුය.


7
ශූන්‍යය ඩොලර් බිලියනයක "වැරැද්දක්" නොවේ. එය කිරීමට නොහැකි අවස්ථා තිබෙනවා statically පෙර පහිටුම් දක්වනය dereferenced කළ නොහැකි බව තහවුරු අර්ථවත් හැකි විය පවතී ; එවැනි අවස්ථාවක දී අවලංගු කිරීමේ උගුලක් තිබීම බොහෝ විට වඩා හොඳ වන්නේ දර්ශකයා මුලින් අර්ථ විරහිත වස්තුවක් හඳුනා ගැනීම අවශ්‍ය වේ. මම විශාලතම ශූන්ය-අදාළ වරද ලබා ඇති, නිර්මාණයන් කර කර හිතන්න char *p = NULL;, කැමැත්ත උගුලක් මත *p=1234නොව, උගුලක් නැහැ char *q = p+5678;වත්*q = 1234;
supercat

38
එය ටෝනි හෝරේ වෙතින් කෙළින්ම උපුටා දක්වා ඇත: en.wikipedia.org/wiki/Tony_Hoare#Apologies_and_retractions . nullදර්ශක අංක ගණිතයේ අවශ්‍ය අවස්ථා ඇති බව මට විශ්වාසයි , ඒ වෙනුවට මම අර්ථකථනය කරන්නේ ඔබේ භාෂාවේ අර්ථකථන සත්කාරකත්වය දැක්වීමට දර්ශක අංක ගණිතය නරක ස්ථානයක් බවයි.
ජේ. ඒබ්‍රහම්සන්

18
up සුපර්කැට්, ඔබට සැබවින්ම ශුන්‍ය නොවන භාෂාවක් ලිවිය හැකිය. එයට ඉඩ දිය යුතුද නැද්ද යන්න තේරීමකි.
පෝල් ඩ්‍රැපර්

6
up සුපර්කැට් - එම ගැටළුව හස්කල්හි ද පවතී, නමුත් වෙනත් ආකාරයකින්. හස්කල් සාමාන්‍යයෙන් කම්මැලි සහ වෙනස් කළ නොහැකි අතර, එබැවින් ඇගයීමට ලක් නොවන p = undefinedතාක් කල් ඔබට ලිවීමට ඉඩ සලසයි p. වඩාත් ප්‍රයෝජනවත් ලෙස, ඔබ undefinedඑය තක්සේරු නොකරන තාක් කල් ඔබට යම් ආකාරයක විකෘති යොමු කිරීමක් කළ හැකිය. වඩාත් බරපතල අභියෝගය වන්නේ කම්මැලි ගණනය කිරීම් අවසන් නොවිය හැකි, ඇත්ත වශයෙන්ම තීරණය කළ නොහැකි ඒවාය. ප්‍රධාන වෙනස නම් මේ සියල්ල නිසැකවම ක්‍රමලේඛන දෝෂ වන අතර සාමාන්‍ය තර්කනය ප්‍රකාශ කිරීමට කිසි විටෙකත් භාවිතා නොකිරීමයි.
ක්‍රිස්ටියන් කොන්කල්

6
up සුපර්කැට් හැස්කෙල්ට විමර්ශන අර්ථ නිරූපණයන් මුළුමනින්ම නොමැත (මෙය යොමු යොමු විනිවිදභාවය පිළිබඳ සංකල්පය වන අතර එයින් අදහස් කෙරෙනුයේ යොමු කිරීම් ආදේශ කිරීමෙන් සියල්ල ආරක්ෂා වන බවයි). මේ අනුව, මම හිතන්නේ ඔබේ ප්‍රශ්නය වැරදිසහගතයි.
ජේ. ඒබ්‍රහම්සන්

80
  • සම්පූර්ණ වර්ගයේ අනුමානය. "ශුද්ධ වූ කපටිය, මම මෙතෙක් කර ඇත්තේ වර්ගයේ අත්සන් ලිවීම පමණි" වැනි හැඟීමකින් තොරව ඔබට සැබවින්ම සංකීර්ණ වර්ග භාවිතා කළ හැකිය .
  • වර්ග සම්පුර්ණයෙන්ම වීජීය වන අතර එමඟින් සමහර සංකීර්ණ අදහස් ප්‍රකාශ කිරීම ඉතා පහසු වේ.
  • හැස්කෙල්ට වර්ග පංති ඇත, ඒවා එක්තරා ආකාරයක අතුරුමුහුණත් වේ, හැරෙන්නට එක් වර්ගයක් සඳහා සියලු ක්‍රියාත්මක කිරීම් එකම ස්ථානයක තැබිය යුතු නොවේ. පවත්නා තෙවන පාර්ශවීය වර්ග සඳහා ඔබේම ආකාරයේ පන්ති ක්‍රියාත්මක කිරීමට ඔබට හැකිය, ඒවායේ ප්‍රභවයට ප්‍රවේශය අවශ්‍ය නොවී.
  • ඉහළ ඇණවුම සහ පුනරාවර්තන ශ්‍රිතයන් වර්ග පරීක්ෂකයාගේ විෂය පථයට වැඩි ක්‍රියාකාරිත්වයක් ලබා දීමේ ප්‍රවණතාවක් ඇත. උදාහරණයක් ලෙස පෙරණය ගන්න . අත්‍යවශ්‍ය භාෂාවකින්, forඑකම ක්‍රියාකාරීත්වය ක්‍රියාත්මක කිරීම සඳහා ඔබට ලූපයක් ලිවිය හැකිය , නමුත් ඔබට එකම ස්ථිතික ආකාරයේ සහතිකයක් නොලැබෙනු ඇත, මන්ද forපුඩුවක් නැවත පැමිණීමේ වර්ගයක් පිළිබඳ සංකල්පයක් නොමැති බැවිනි .
  • උප ප්‍රභේද නොමැතිකම පරාමිතික බහුමාපකය බෙහෙවින් සරල කරයි.
  • ඉහළ වර්ගයේ වර්ග (වර්ග වර්ග) හස්කල් හි සඳහන් කිරීමට සහ භාවිතා කිරීමට සාපේක්ෂව පහසු වන අතර, එය ජාවාහි සම්පූර්ණයෙන්ම තේරුම්ගත නොහැකි වර්ග වටා වියුක්තයන් නිර්මාණය කිරීමට ඔබට ඉඩ සලසයි.

7
කදිම පිළිතුර - ඉහළ කාරුණික වර්ගයක සරල උදාහරණයක් ඔබට ලබා දිය හැකිද, එය ජාවා හි කළ නොහැක්කේ මන්දැයි තේරුම් ගැනීමට මට උපකාරී වනු ඇතැයි සිතන්න.
phatmanace

3
මෙහි හොඳ උදාහරණ කිහිපයක් තිබේ .
කාල් බීල්ෆෙල්ඩ්

3
රටා ගැලපීම ද සැබවින්ම වැදගත් ය, එයින් අදහස් කරන්නේ ඔබට ඉතා පහසුවෙන් තීරණ ගැනීමට වස්තුවක වර්ගය භාවිතා කළ හැකි බවයි.
බෙන්ජමින් ග ru න්බෝම්

2
En බෙන්ජමින් ග ru න්බෝම් මම හිතන්නේ නැහැ මම එය වර්ග පද්ධති අංගයක් ලෙස හඳුන්වන්නම් කියලා.
ඩොවල්

3
ADTs සහ HKTs නිශ්චිතවම පිළිතුරේ කොටසක් වන අතර, මෙම ප්‍රශ්නය අසන ඕනෑම අයෙකු ඒවා ප්‍රයෝජනවත් වන්නේ මන්දැයි දැනගනු ඇතැයි මම සැක කරමි, මෙය පැහැදිලි කිරීම සඳහා කොටස් දෙකම පුළුල් කළ යුතු යැයි මම යෝජනා කරමි
jk.

63
a :: Integer
b :: Maybe Integer
c :: IO Integer
d :: Either String Integer

හැස්කෙල් හි: පූර්ණ සංඛ්‍යාවක්, ශුන්‍ය විය හැකි පූර්ණ සංඛ්‍යාවක්, බාහිර ලෝකයෙන් පැමිණි පූර්ණ සංඛ්‍යාවක් සහ ඒ වෙනුවට නූලක් විය හැකි පූර්ණ සංඛ්‍යාවක් මේ සියල්ලම එකිනෙකට වෙනස් වර්ග වේ - සම්පාදකයා මෙය බලාත්මක කරයි . මෙම වෙනස්කම් වලට ගරු කිරීමට අපොහොසත් වන හස්කල් වැඩසටහනක් ඔබට සම්පාදනය කළ නොහැක.

(කෙසේ වෙතත්, ඔබට වර්ග ප්‍රකාශයන් මඟ හැරිය හැක. බොහෝ විට, සම්පාදකයාට ඔබේ විචල්‍යයන් සඳහා වඩාත් පොදු වර්ගය තීරණය කළ හැකි අතර එය සාර්ථක සම්පාදනයකට හේතු වේ. එය පිළිවෙළකට නොවේද?)


12
+1 මෙම පිළිතුර සම්පුර්ණ නොවූවත්, එය ප්‍රශ්නයේ මට්ටමට වඩා හොඳ යැයි මම සිතමි
jk.

1
+1 වෙනත් භාෂාවන්ටද Maybe(උදා: ජාවා Optionalසහ ස්කාලා Option) ඇති බව පැහැදිලි කිරීමට එය උපකාරී වනු ඇත , නමුත් එම භාෂාවලින් එය අඩක් බේක් කළ විසඳුමකි, මන්ද ඔබට සෑම විටම nullඑම වර්ගයේ විචල්‍යයකට අනුයුක්ත කළ හැකි අතර ඔබේ වැඩසටහන ක්‍රියාත්මක වන විට පුපුරා යන්න. කාලය. හස්කල් සමඟ මෙය සිදුවිය නොහැක [1], ශුන්‍ය වටිනාකමක් නැති නිසා ඔබට වංචා කළ නොහැක. ([1]: ඇත්ත වශයෙන්ම, ඔබට ඇති fromJustවිට වැනි අර්ධ ශ්‍රිත භාවිතා කරමින් ඔබට NullPointerException ට සමාන දෝෂයක් ජනනය කළ හැකිය Nothing, නමුත් එම කාර්යයන් බොහෝ විට කෝපයට පත් වේ).
ඇන්ඩ්‍රස් එෆ්.

2
"බාහිර ලෝකයෙන් වටිනාකමක් ඇති පූර්ණ සංඛ්‍යාවක්" - IO Integer'ක්‍රියාත්මක කරන විට පූර්ණ සංඛ්‍යාවක් ලබා දෙන උප ප්‍රෝග්‍රෑම්' වෙත සමීප නොවන්නේද? දී) ලෙස main = c >> cපළමු විසින් ලබා දෙන වටිනාකම cදෙවන විසින් පසුව වෙනස් විය හැකිය cඅතර aනොතකා (අපි තනි විෂය පථය වේ දිගු ලෙස) තම තත්වය එකම අගය ඇත ආ) බාහිර ලෝකයේ සිට වටිනාකම් එහි sanatisation ක්රියාත්මක කිරීමට අදහස් කරයි වර්ග සහ ඇත (එනම් ඒවා කෙලින්ම තැබීමට නොව පරිශීලකයාගේ ආදානය නිවැරදිද / අනිෂ්ටද යන්න පළමුව පරීක්ෂා කරන්න).
මැකීජ් පීචොට්කා

4
මැකීජ්, එය වඩාත් නිවැරදි වනු ඇත. මම සරල බව සඳහා උත්සාහ කරමින් සිටියෙමි.
වුල්ෆ්ෆාන්

31

බොහෝ දෙනෙක් හැස්කෙල් ගැන හොඳ දේවල් ලැයිස්තුගත කර ඇත. නමුත් ඔබේ නිශ්චිත ප්‍රශ්නයට පිළිතුරු වශයෙන් “වර්ග ක්‍රමය මඟින් වැඩසටහන් වඩාත් නිවැරදි කරන්නේ ඇයි?”, පිළිතුර “පරාමිතික බහුමාපකය” යැයි මම සැක කරමි.

පහත දැක්වෙන හස්කල් ශ්‍රිතය සලකා බලන්න:

foobar :: x -> y -> y

නැත වචනාර්ථයෙන් පමණක් එක් විය හැකි ආකාරය මෙම කාර්යය ක්රියාත්මක කිරීමට. අත්සන වර්ගය අනුව, මට මෙම ශ්‍රිතය කරන්නේ කුමක්දැයි හරියටම කිව හැකිය , මන්ද එයට කළ හැකි එකම දෙය ඇත්තේය . [හරි, තරමක් නොවේ, නමුත් පාහේ!]

නැවතී ඒ ගැන මොහොතකට සිතන්න. එය ඇත්තෙන්ම විශාල ගනුදෙනුවක්! එයින් අදහස් වන්නේ මම මෙම අත්සන සමඟ ශ්‍රිතයක් ලියන්නේ නම්, ඇත්ත වශයෙන්ම ශ්‍රිතයට මා අදහස් කළ දේ හැර වෙනත් කිසිවක් කළ නොහැකි ය . (අත්සන වර්ගය තවමත් වැරදියි. ඇත්ත වශයෙන්ම කිසිම ක්‍රමලේඛන භාෂාවක් කිසි විටෙකත් සියලු දෝෂ වළක්වන්නේ නැත .)

මෙම කාර්යය සලකා බලන්න:

fubar :: Int -> (x -> y) -> y

මෙම කාර්යය කළ නොහැකි ය . ඔබට මෙම ක්‍රියාව ක්‍රියාත්මක කළ නොහැක. මට ඒක කියන්න පුළුවන් අත්සනින්.

ඔබට පෙනෙන පරිදි, හැස්කල් වර්ගයේ අත්සනක් ඔබට බොහෝ දේ කියයි!


C # සමඟ සසඳන්න. (කණගාටුයි, මගේ ජාවා ටිකක් මලකඩයි.)

public static TY foobar<TX, TY>(TX in1, TY in2)

මෙම ක්‍රමයට කළ හැකි කරුණු කිහිපයක් තිබේ:

  • ප්රති .ලය in2ලෙස ආපසු යන්න .
  • සදහටම ලූප් කරන්න, කිසි විටෙකත් කිසිවක් ආපසු නොයන්න.
  • ව්යතිරේකයක් විසි කරන්න, කිසි විටෙකත් කිසිවක් ආපසු එවන්න එපා.

ඇත්ත වශයෙන්ම, හස්කල්ට මෙම විකල්ප තුන ද තිබේ. නමුත් C # ඔබට අමතර විකල්ප ලබා දෙයි:

  • ආපසු හරවන්න. (හස්කල්ට ශුන්‍ය නැත.)
  • in2එය ආපසු දීමට පෙර වෙනස් කරන්න . (හස්කල් හට ස්ථානීය වෙනස් කිරීම් නොමැත.)
  • පරාවර්තනය භාවිතා කරන්න. (හස්කල්ට පරාවර්තනයක් නොමැත.)
  • ප්‍රති .ලයක් ලබා දීමට පෙර I / O ක්‍රියා කිහිපයක් කරන්න. (ඔබ මෙහි I / O සිදු කරන බව ප්‍රකාශ නොකරන්නේ නම් හැස්කෙල් ඔබට I / O සිදු කිරීමට ඉඩ නොදේ.)

පරාවර්තනය විශේෂයෙන් විශාල මිටියක්; පරාවර්තනය භාවිතා කරමින්, මට TYතුනී වාතයෙන් නව වස්තුවක් තැනිය හැකි අතර එය නැවත ලබා දෙන්න! මට වස්තූන් දෙකම පරීක්ෂා කළ හැකි අතර, මා සොයා ගන්නා දේ අනුව වෙනස් ක්‍රියා කරන්න. සම්මත කරන ලද වස්තූන් දෙකටම මට අත්තනෝමතික වෙනස් කිරීම් කළ හැකිය.

I / O ඒ හා සමාන විශාල මිටියක්. කේතය පරිශීලකයාට පණිවිඩ පෙන්වීම හෝ දත්ත සමුදා සම්බන්ධතා විවෘත කිරීම හෝ ඔබේ දෘඩ තැටිය නැවත ආකෘතිකරණය කිරීම හෝ ඕනෑම දෙයක් විය හැකිය.


මෙම Haskell foobarකාර්යය, ඊට වෙනස් ලෙස, හැකි එකම සමහර දත්ත සහ නැවත දත්ත, නොවෙනස්ව ගන්න වෙනවා. සම්පාදනය කරන වේලාවේදී එහි වර්ගය නොදන්නා නිසා එයට දත්ත "බැලීමට" නොහැකිය. එයට නව දත්ත නිර්මාණය කළ නොහැක, මන්ද ... හොඳයි, හැකි ඕනෑම වර්ගයක දත්ත ඔබ ගොඩනඟන්නේ කෙසේද? ඒ සඳහා ඔබට පරාවර්තනයක් අවශ්‍ය වේ. එයට කිසිදු I / O සිදු කළ නොහැක, මන්ද යත් අත්සන වර්ගයේ I / O සිදු කරන බව ප්‍රකාශ නොකරන බැවිනි. එබැවින් එයට ගොනු පද්ධතිය හෝ ජාලය සමඟ අන්තර් ක්‍රියා කිරීමට හෝ එකම වැඩසටහනක නූල් ධාවනය කිරීමට පවා නොහැකිය! (එනම්, එය 100% සහතික කළ නූල්-ආරක්ෂිතයි.)

ඔබ විසින්, දැක ගැනීමට හැකි වන පරිදි නොවන ඔබ දේවල් සමස්තයක් පොකුරක් කරන්න ඉඩ, Haskell ඔබ ඔබේ කේතය ඇත්තටම කරන්නේ දේ ගැන ඉතා ශක්තිමත් සහතික කිරීමට ඉඩ ඇත. එතරම් තදින්, ඇත්ත වශයෙන්ම, (සැබවින්ම බහුමාමක කේතය සඳහා) සාමාන්‍යයෙන් ඇත්තේ කෑලි එකට ගැලපෙන එකම ක්‍රමයක් පමණි.

(පැහැදිලි විය කිරීම සඳහා: එය වර්ගය අත්සන බොහෝ ඔබට කියමි නැත එහිදී Haskell කාර්යයන් ලිවීමට තවමත් හැකි ය. Int -> Intදැන් කිසිම දෙයක් ගැන විය හැකි නමුත් ඒ සඳහා පවා, අපිට එකම ආදාන සෑම විටම 100% ක් නිශ්චිතව ම ප්රතිදානය නිෂ්පාදනය කරන බව අපි දන්නවා.. ජාවා එය සහතික නොකරයි!)


4
+1 නියම පිළිතුර! මෙය ඉතා බලවත් වන අතර බොහෝ විට හස්කල් වෙත නවකයන් විසින් අවතක්සේරු කරනු ලැබේ. මාර්ගය වන විට, සරල "කළ නොහැකි" කාර්යයක් වනු ඇත fubar :: a -> b, එසේ නොවේ ද? (ඔව්, මම ගැන දන්නවා unsafeCoerceමම හිතන්නේ අපි එහි නාමයෙන් "අනාරක්ෂිත" සමග කිසිම දෙයක් ගැන කතා කරන්නේ නැහැ, නොකා නවක සාමාජිකයන්ට ප්රයෝජනවත් විය ඒ ගැන කලබල විය යුතුයි යැයි උපකල්පනය කරන්න:. ඩී!)
Andres එෆ්

ඔබට ලිවිය නොහැකි සරල ආකාරයේ අත්සන් ගොඩක් තිබේ, ඔව්. උදාහරණයක් ලෙස, foobar :: xඑය ක්‍රියාත්මක කළ නොහැකි තරම්ය ...
ගණිතමය

ඇත්ත වශයෙන්ම, ඔබට පිරිසිදු කේත නූල්-අනාරක්ෂිත කළ නොහැක , නමුත් ඔබට එය තවමත් බහු-නූල් කළ හැකිය. ඔබේ විකල්පයන් වන්නේ "ඔබ මෙය ඇගයීමට පෙර, මෙය ඇගයීමට ලක් කරන්න", "ඔබ මෙය ඇගයීමට ලක් කරන විට, ඔබට මෙය වෙනම ත්‍රෙඩ් එකකින් ඇගයීමට අවශ්‍ය වනු ඇත", සහ "ඔබ මෙය ඇගයීමට ලක් කරන විට, මෙයද ඇගයීමට ඔබට අවශ්‍ය විය හැකිය, සමහර විට වෙනම නූලකින් ". පෙරනිමිය "ඔබේ අභිමතය පරිදි කරන්න" යන්නයි, එහි අර්ථය වන්නේ "හැකි තරම් ප්‍රමාද වී ඇගයීම" යන්නයි.
ජෝන් ඩ්වොරක්

වඩාත් ප්‍රායෝගිකව ඔබට අතුරු ආබාධ ඇති in1 හෝ in2 මත නිදර්ශන ක්‍රම ඇමතිය හැකිය. නැතහොත් ඔබට ගෝලීය තත්වය වෙනස් කළ හැකිය (එය හස්කල් හි IO ක්‍රියාවක් ලෙස ආදර්ශනය කර ඇත, නමුත් බොහෝ අය IO ලෙස සිතන දේ නොවිය හැක).
ඩග් මැක්ලීන්

2
සමාවයවිකතාව වර්ගය x -> y -> yපරිපූර්ණ ලෙස ක්‍රියාත්මක කළ හැකිය. වර්ගය (x -> y) -> yනොවේ. වර්ගය x -> y -> yයෙදවුම් දෙකක් ගන්නා අතර දෙවැන්න නැවත ලබා දෙයි. වර්ගය (x -> y) -> yගනී උත්සවයකට ක්රියාත්මක කෙරෙන xඅතර, කෙසේ හෝ කළ යුතුය yඑයින් ...
MathematicalOrchid

17

අදාළ SO ප්‍රශ්නයක් .

හැස්කෙල් තුළ ඔබටත් එසේ කළ හැකි යැයි මම සිතමි (එනම් පළමු පන්තියේ දත්ත සමුදායන් විය යුතු දේවල් නූල් / තීන්ත බවට පත් කරන්න)

නැත, ඔබට සැබවින්ම නොහැකිය - අවම වශයෙන් ජාවාට හැකි ආකාරයටම නොවේ. ජාවාහිදී, මෙවැනි දෙයක් සිදු වේ:

String x = (String)someNonString;

ජාවා සතුටින් උත්සාහ කර ඔබේ නූල් නොවන සංගීත භාණ්ඩයක් ලෙස දමනු ඇත. හස්කල් මේ ආකාරයේ දේකට ඉඩ නොදෙන අතර, මුළු පන්තියේ ධාවන කාල දෝෂ ඉවත් කරයි.

nullවර්ගය පද්ධතියේ (ලෙස Nothing) කොටසක් වන බැවින් පැහැදිලිව විමසීමට හා හැසිරවීමට අවශ්‍ය වන අතර අනෙක් සියලුම පන්ති ධාවන දෝෂ ඉවත් කරයි.

සන්නිවේදනය සඳහා ප්‍රමාණවත් දැනුමක් ලබා ගැනීමට මට විශේෂ ise තාවයක් නොමැති බව - විශේෂයෙන් නැවත භාවිතා කිරීම සහ වර්ග පංති වටා - වෙනත් සියුම් ප්‍රතිලාභ රාශියක් ඇත.

බොහෝ දුරට එසේ වන්නේ, හස්කල්ගේ වර්ගයේ පද්ධතිය මඟින් ප්‍රකාශන හැකියාව ලබා දෙන බැවිනි. ඔබට නීති කිහිපයක් සමඟින් බොහෝ දේ කළ හැකිය. සදාකාලික හස්කල් ගස සලකා බලන්න:

data Tree a = Leaf a | Branch (Tree a) (Tree a) 

තරමක් සාමාන්‍ය කියවිය හැකි එක් පේළියක ඔබ සම්පූර්ණ සාමාන්‍ය ද්විමය ගසක් (සහ දත්ත සාදන්නන් දෙදෙනෙකු) අර්ථ දක්වා ඇත. සියල්ලම නීති කිහිපයක් භාවිතා කිරීම ( එකතුව වර්ග සහ නිෂ්පාදන වර්ග සහිත ). එය ජාවා හි 3-4 කේත ගොනු සහ පන්ති වේ.

විශේෂයෙන් ගෞරවයට පාත්‍ර වන ආකාරයේ පද්ධති අතර, මේ ආකාරයේ සංක්ෂිප්තභාවය / අලංකාරය ඉතා අගය කොට සලකනු ලැබේ.


මට තේරුණේ ඔබේ පිළිතුරෙන් NullPointerExceptions පමණි. ඔබට තවත් උදාහරණ ඇතුළත් කළ හැකිද?
ජෙස්වින් ජෝස්

2
අනිවාර්යයෙන්ම සත්‍ය නොවේ, JLS §5.5.1 : T යනු පන්ති වර්ගයක් නම්, එක්කෝ | S | <: | ටී |, හෝ | ටී | <: | එස් |. එසේ නොමැතිනම්, සම්පාදක කාල දෝෂයක් සිදු වේ. එබැවින් සම්පාදකයා ඔබට වෙනස් කළ නොහැකි වර්ග වාත්තු කිරීමට ඉඩ නොදේ - පැහැදිලිවම ඒ වටා ක්‍රම තිබේ.
බොරිස් ද ස්පයිඩර්

මගේ මතය අනුව, වර්ග පංතිවල වාසි ලබා ගත හැකි සරලම ක්‍රමය නම් ඒවා interfaceසත්‍යයට පසුව එකතු කළ හැකි s වැනි ඒවා වන අතර ඒවා ක්‍රියාත්මක කරන වර්ගය "අමතක" නොකරයි. ඔබ උත්සවයකට තර්කයන් දෙකක් සමග මෙන් නොව, එකම වර්ගයේ ඇති බව සහතික කළ හැකි, වන interfaceදෙකක් එහිදී ගේ List<String>ගේ විවිධ නිර්මාණයන් සිදු විය හැකියි. සෑම අතුරුමුහුණතකටම වර්ග පරාමිතියක් එක් කිරීමෙන් ඔබට තාක්ෂණික වශයෙන් ජාවාහි සමාන දෙයක් කළ හැකිය, නමුත් පවතින අතුරුමුහුණත් වලින් 99% ක් එය නොකරන අතර ඔබ ඔබේ සම වයසේ මිතුරන්ගෙන් නිරය ව්‍යාකූල කරයි.
ඩොවල්

2
OrBoristheSpider ඇත්ත, නමුත් වාත්තු කිරීමේ ව්‍යතිරේකයන් සෑම විටම පාහේ සුපිරි පන්තියක සිට උප පංතියකට හෝ අතුරු මුහුණතක සිට පන්තියකට පහත් කිරීම ඇතුළත් වන අතර සුපිරි පන්තිය වීම අසාමාන්‍ය දෙයක් නොවේ Object.
ඩොවල්

2
මම සිතන්නේ නූල් පිළිබඳ ප්‍රශ්නයේ කාරණය වාත්තු කිරීම සහ ධාවන කාල ආකාරයේ දෝෂ සමඟ සම්බන්ධ නොවීමයි, නමුත් ඔබට වර්ග භාවිතා කිරීමට අවශ්‍ය නැතිනම් ජාවා ඔබව සාදන්නේ නැත - ඇත්ත වශයෙන්ම ඔබේ දත්ත අනුක්‍රමිකව ගබඩා කිරීම පෝරමය, තාවකාලික වර්ගයක් ලෙස නූල් අනිසි ලෙස භාවිතා කිරීම any. හැස්කෙල් ඔබ මෙය කිරීම නවත්වන්නේ නැත, මන්ද ... හොඳයි, එයට නූල් ඇත. හස්කල්ට ඔබට මෙවලම් ලබා දිය හැකිය, කැදැලි සන්දර්භයක් තුළ නැවත සොයා ගැනීම සඳහා පරිවර්තකයෙකු ප්‍රමාණවත් තරම් ග්‍රීන්ස්පනිං කිරීමට ඔබ අවධාරනය කරන්නේ නම් මෝඩ දේවල් කිරීමෙන් ඔබව බලහත්කාරයෙන් වළක්වා ගත නොහැක null. කිසිම භාෂාවකට බැහැ.
ලියුෂෙන්කෝ

0

හුරුපුරුදු පුද්ගලයින් බොහෝ විට කතා කර ඇති 'මේම්ස්' වලින් එකක් නම්, සමස්තය "එය සම්පාදනය කළහොත් එය ක්‍රියාත්මක වනු ඇත *" දෙයයි - මා සිතන්නේ එය වර්ග පද්ධතියේ ශක්තියට සම්බන්ධ බවයි.

කුඩා වැඩසටහන් සමඟ මෙය බොහෝ දුරට සත්‍ය වේ. වෙනත් භාෂාවලින් පහසු වන වැරදි කිරීමෙන් හස්කල් ඔබව වළක්වයි (උදා: සංසන්දනය කිරීමInt32 a Word32හා a හා යමක් ), නමුත් එය සියලු වැරදි වලින් ඔබව වළක්වන්නේ නැත.

හස්කල් ඇත්ත වශයෙන්ම ප්‍රතිචක්‍රීකරණය බොහෝ දේ කරයි පහසු. ඔබේ වැඩසටහන කලින් නිවැරදි නම් සහ එය යතුරු ලියනය කරන්නේ නම්, සුළු සංශෝධනවලින් පසුව එය තවමත් නිවැරදි වීමට සාධාරණ අවස්ථාවක් තිබේ.

මේ සම්බන්ධයෙන් වෙනත් සංඛ්‍යාත්මකව ටයිප් කළ භාෂාවන්ට වඩා හස්කල් වඩා හොඳ වන්නේ මන්දැයි මම තේරුම් ගැනීමට උත්සාහ කරමි.

හස්කල් හි වර්ග තරමක් සැහැල්ලු ය, නව වර්ග ප්‍රකාශ කිරීම පහසුය. මෙය රස්ට් වැනි භාෂාවකට වඩා වෙනස් ය, සෑම දෙයක්ම මඳක් කරදරකාරී ය.

මගේ උපකල්පනය නම් මෙය ශක්තිමත් වර්ගයේ ක්‍රමයක් මගින් මිනිසුන් අදහස් කරන බවයි, නමුත් හස්කල් වඩා හොඳ වන්නේ මන්දැයි මට පැහැදිලි නැත.

සරල එකතුව හා නිෂ්පාදන වර්ග ඉක්මවා හැස්කෙල්ට බොහෝ විශේෂාංග ඇත; එයට විශ්වීය වශයෙන් ප්‍රමාණාත්මක වර්ග තිබේ (උදාid :: a -> a ) ද ඇත. ජාවා හෝ රස්ට් වැනි භාෂාවකට වඩා බෙහෙවින් වෙනස් වන කාර්යයන් අඩංගු වාර්තා වර්ග ඔබට නිර්මාණය කළ හැකිය.

GHC හට වර්ග මත පමණක් පදනම්ව සමහර අවස්ථා ව්‍යුත්පන්න කළ හැකි අතර, ජනක විද්‍යාවේ දියුණුවේ සිට, ඔබට වර්ග අතර සාමාන්‍ය කාර්යයන් ලිවිය හැකිය. මෙය තරමක් පහසු වන අතර එය ජාවාහි ඇති තරමට වඩා චතුර ලෙස භාවිතා කරයි.

තවත් වෙනසක් නම්, හස්කල්ට සාපේක්ෂව හොඳ ආකාරයේ දෝෂ ඇති වීමයි (ලිවීමේදී, අවම වශයෙන්). හස්කල්ගේ වර්ගයේ අනුමානය අති නවීන වන අතර, සම්පාදනය කිරීමට යමක් ලබා ගැනීම සඳහා ඔබට වර්ගීකරණ විවරණ ලබා දීම අවශ්‍ය වන්නේ කලාතුරකිනි. මෙය රස්ට් හා සසඳන විට, සම්පාදකයාට ප්‍රතිපත්තිමය වශයෙන් වර්ගය අඩු කළ හැකි වුවද, සමහර විට අනුමාන කිරීම් අවශ්‍ය වේ.

අවසාන වශයෙන්, හස්කල්ට ටයිප් ක්ලාස් ඇත, ඒවා අතර සුප්‍රසිද්ධ මොනාඩ් ය. මොනාඩ්ස් සිදුවන්නේ දෝෂ හැසිරවීමට විශේෂයෙන් හොඳ ක්‍රමයක් ලෙස ය; nullභයානක මූලික නිදොස් කිරීමකින් තොරව සහ ඔබේ වර්ගයේ ආරක්ෂාව කිසිවක් අත් නොහරිමින් ඔවුන් මූලික වශයෙන් ඔබට සියලු පහසුව ලබා දෙයි. එබැවින් මෙම වර්ගවල කාර්යයන් ලිවීමේ හැකියාව ඇත්ත වශයෙන්ම ඒවා භාවිතා කිරීමට අපව දිරිමත් කිරීමේදී තරමක් වැදගත් වේ!

වෙනත් ක්‍රමයක් තබන්න, ඔබට හොඳ හෝ නරක ජාවා ලිවිය හැකිය, මම හිතන්නේ ඔබටත් එය හස්කල්හි කළ හැකිය

එය සමහර විට සත්‍යයක් විය හැකි නමුත් එය තීරණාත්මක කරුණක් මග හැරී ඇත: ඔබ ජස්කාවේ පාදයට වෙඩි තැබීම ආරම්භ කරන ස්ථානයට වඩා හස්කල්හි පාදයට වෙඩි තැබීමට පටන් ගන්නා ස්ථානය තවත් ඉදිරියට යයි.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.