䞀方、Haskellチュヌトリアル

この蚘事では、䞀般的な耇雑さず高床に専門化された関数型プログラミング、特にHaskell蚀語に関する神話を暎きたいず思いたす。 Haskellの理解が最小限の人でも、この蚘事を理解できるようにしようず思いたす。 しかし、最初に、小さな玹介。



自分は怠け者のアマチュア写真家だず思いたす。 私には良い「ミラヌレスミラヌ」がありたす。時々、自分の呚りの䜕かをクリックしたいずいう欲求に襲われたす。 しかし、私は怠け者であり、結果の写真アヌカむブをいじくり回し、時間も欲望もありたせん。 原則ずしお、カメラをHDMIケヌブルでテレビに接続するこずで、撮圱埌すぐに1、2回写真を芋るこずができたす。 その埌、写真は忘华に送られたす〜/ Pictures / Photos / Unsortedディレクトリ、そしお、原則ずしお、氞遠にそこに残りたす。 さたざたなスペシャル付き。 私はどういうわけか友達を䜜らなかったので、この混乱はほが2幎続いた。 そしお、Haskellを研究した結果、私は問題を解決するために成熟したした。



免責事項



私は関数型プログラミングの第䞀人者のふりをしたせん。私が曞いたコヌドはひどいものだず認めおいたす結局、Haskellは暇なずきに2か月以䞊間密接にやっおいたす。さらに、正しく動䜜しない可胜性がありたす。 この蚘事の目的は、Haskellが悪倢や耇雑な数孊的蚈算だけでなく、日垞的な日垞的なタスクにも䜿甚できる汎甚蚀語であるこずを瀺すこずです。 そしおそれらに完党に察凊する。



この問題を解決する特別なプログラムが存圚するこずは承知しおいたすが、必芁なこずを正確に行うシンプルで基本的なナヌティリティが必芁でした。 この問題は䞀般的にいく぀かのbashたたはperlで解決できるこずを知っおいたすが、これは著者、぀たり私が遞択したものです。



始める前に



これは長匕く導入の最埌の郚分だず思いたす。 最初に、もちろん、Haskellの基本的な知識を持っおいるこずが望たしいです。さもないず、倚くのこずがわかりにくいかもしれたせん。 モナドのアむデアがあるずいいですね。 ただし、プレれンテヌションのプロセスにおける「埮劙な」点に぀いお説明するようにしたす。この蚘事を皆さんが少しでも努力しお理解しおくれるこずを願っおいたす。



第二に、必芁なツヌル。 さらに、すべおのむベントはLinuxマシン䞊で展開されるものず想定されおいたすが、マむナヌな倉曎を加えるず、Windows、さらにはMac OS Xでも同様になりたす。

  1. Haskellプラットフォヌムをディストリビュヌションのリポゞトリからダりンロヌドしおむンストヌルしたす。
  2. EXIFを䜿甚するHaskellラむブラリをsudo cabal install --global exif



    ;
  3. GTK + \ Gladeおよび察応するHaskellのバむンディングをsudo cabal install --global glade



     sudo cabal install --global glade



    。




問題の声明



そのため、察応するフォルダヌに日付ごずに写真を「パック」するための最も簡単なナヌティリティが必芁でした。 原則ずしお、すべお、耇雑なこずは䜕もありたせん。



どのように決定したすか



すべおがシンプルです。 たず、2぀のモヌドをサポヌトする必芁がありたす。

䞀般的に蚀っお、GUIはここではたったく必芁ありたせんが、これはHaskellのGUIも決しお怖くないこずを瀺す䞀般的な小さなトレヌニング䟋であるこずを思い出しおください。



さらに、カタログがどのようにスリップされたずしおも、倚くのカメラすべおではないにしおもがPHOTOフォルダヌに慎重に写真を入れおから、100PANA、101PANAなどにこのディレクトリをバむパスしたすすべおのサブディレクトリをバむパスするこずを含む。 .p。各ファむルを凊理したす。



個々のファむルの凊理は非垞に簡単です。Exifデヌタを読み取り、もしあれば、抜出した日付に察応するディレクトリにそれ写真ファむルをコピヌしたす。



望んでもいなくおも、プログラムが䜕をすべきかを䌝える過皋で、その3぀の䞻な機胜を説明したした。





ここでいく぀かの゜ヌスコヌドを远加したしょう。



コヌドにより近い



叙情的な䜙談。 Haskellプログラムは、Cのようにモゞュヌル構造を持っおいたすが、もちろんひどいヘッダヌファむルはありたせん。 ゚クスポヌトされた倖郚関数はモゞュヌルの説明で指定され、他のモゞュヌルずコヌドのむンポヌトがありたす。 Haskellプログラムは、デヌタ型ず関数の説明のみで構成されおいたす。 それだけです



それでは、もう䞀床始めたしょう。 ぀たり、Mainモゞュヌルのmain関数を䜿甚したす結局、プログラムを開始するのはそれです。 これがモゞュヌル党䜓のコヌドです

メむン







  1. モゞュヌルメむン
  2. むンポヌトシステムgetArgs
  3. 茞入マネヌゞャヌ
  4. むンポヌトGUI
  5. メむン:: IO
  6. main = getArgs >> =起動
  7. -写真ぞのパスを含む単䞀の匕数が必芁です。それ以倖の堎合はguiを実行したす
  8. 起動:: [文字列]-> IO
  9. launch [x] = processDirectory x
  10. launch _ = startGUI
*この゜ヌスコヌドは、 ゜ヌスコヌドハむラむタヌで匷調衚瀺されたした。




最初のモゞュヌルの説明をもう少し詳しく説明し、䞻なものを説明したす。 したがっお、最初の行はモゞュヌルの説明です。 次はむンポヌト行ですgetArgs関数のみがSystemモゞュヌルからむンポヌトされ、実行可胜ファむルの名前なしでコマンドラむン匕数のリストを返したす。 マネヌゞャヌおよびGUIモゞュヌルに぀いおは埌述したす。



以䞋はmain



機胜の説明です。 説明の最初の行は、タむプのオプションの定矩であり、䞀般的には、必ずしも必芁ではありたせん。ほずんどの堎合、関数のタむプは、提䟛された匕数のタむプから掚枬できたす。 関数は方皋匏系で蚘述され、2行目はその方皋匏です。



叙情的な䜙談。 正匏には、すべおの機胜はクリヌンで「ダヌティ」に分類でき、副䜜甚がありたす。 私は指で説明しようずしたす。

関数は、同じ入力デヌタで同じ出力デヌタを生成し、システムの状態を倉曎せず、それらに䟝存しないファむルシステムの状態、たたは開いおいるTCP接続の存圚堎合、クリヌンです。 䟋ずしお远加機胜を取り䞊げたす。 2぀の匕数を取り、これらの匕数の䞡方が数倀2に等しい堎合、出力では垞に絶察に垞に数倀4を取埗したす。そしお、はい、TCP接続を远加する機胜は開きたせん。

副䜜甚のある関数は別の䌚話です。これらは、 入力/出力モナドIOモナドず呌ばれるモデルを介しお、倖郚の兆候に察する関数の䟝存関係を瀺すために考案されたものです。 認識を簡単にするために、珟時点では「入力/出力」のコンテキストでのみモナドに぀いお考えたす実際、この抂念ははるかに広いです。 副䜜甚のある関数は、 アクションのシヌケンスの蚘述であり、その結果、特定の結果倀を取埗したす。 䟋

readFile :: FilePath -> IO (String)



は、このファむルぞの指定されたパスにあるファむルを読み取る関数です。 より正確には、これは関数ではなく、そのタむプです。 関数のタむプを読むのは非垞に簡単です。最初に関数の名前が来たす。次に、蚘号が付いた2぀のコロンの埌に->関数の匕数が分離され、極端な埌に->戻り倀のタむプがありたす。 これは基本的な説明ですが、今のずころはこれで十分です。 ぀たり、関数が特定のFilePathを受け入れ、入力/出力アクションを返し、その実行により文字列倀が埗られるこずがわかりたす。

アクションのシヌケンスを理解するこずが重芁です=蚈算のシヌケンス。 実際、 通垞 、蚈算が実際に行われる順序は正確にはわかりたせん。蚈算の遅れを決定するだけです。 したがっお、モナドなどの抜象化の存圚は、Haskellを必須にするものではありたせん。



したがっお、 main



に戻りたす。 匕数を取らず、明らかにI / Oアクションを返したす。 このアクションの実装は、プログラム党䜓の実行です。 おもしろいですが、受け取ったプログラム党䜓に単䞀の玔粋な関数が曞かれおいるわけではなく、利甚可胜なすべおのチュヌトリアルずはたったく異なりたすが、これはプログラムが解決する問題です。 アクションのシヌケンスは、2぀の匕数を取る関数>>=



および>>



によっお決定されたす。 最初のケヌスでは、巊偎のアクションの結果が匕数ずしお右偎の関数呌び出しに枡され、2番目のケヌスでは、巊偎のアクションが単にサむレントに実行され、その埌右偎のアクションが実行されたす。



この堎合、 getArgs



関数で定矩されたアクションを実行するず、アプリケヌション匕数文字列のリストが実行され、それがlaunch



関数に枡されたす。 起動機胜に぀いお以䞋に説明したす。 匕数ずしお文字列のリストを受け取りたすが、倀を返さないI / Oアクションも返したす。 既に述べたように、Haskellの関数は方皋匏のシステムによっお蚘述され、それは起動の定矩で芖芚的に提瀺されたす。



叙情的な䜙談。 特定の関数呌び出しごずにどの匏が遞択されるかは、パタヌンマッチング手順、぀たりパタヌンマッチングによっお決たりたす。 関数テンプレヌトは、巊偎で定矩された方皋匏の䞀郚によっお定矩されたす。 パタヌンマッチング手順は、コヌドに衚瀺される順序でコントロヌルを遞択したす。 「䜕でも」の普遍的なテンプレヌトはシンボル_



です。 テンプレヌトでは、さたざたなデヌタ構造を分解できたすたずえば、そうする必芁がありたす。たずえば、 foo ["a",""] = 0



ず曞くず、関数fooに2行 "a"ず "b"のリストが来るず、 0を返したす。



したがっお、 launch



関数に単䞀の倀x



リストが付属しおいる堎合、これはディレクトリぞのパスであるず考え、その



自䜓に等しい匕数を䜿甚しおManagerモゞュヌルからprocessDirectory



関数を呌び出したす関数をどのモゞュヌルから明瀺的に瀺す必芁はないこずに泚意しおくださいこれが二重の解釈を䞎えない堎合、぀たり、2぀のモゞュヌルに同じ名前の関数がありたす。 そしお、䜕か他のもの _



テンプレヌトに泚意を払う _



を実行したす。



これがメむンモゞュヌル党䜓です プログラムの機胜1を実装したした。それを開始したした

はい、私はそれがどれだけひどく未開始を探しおいるか理解しおいたすが、今は゜ヌスモゞュヌルMainをもう䞀床芋おください。 すべおの叙情的な䜙談をもう䞀床読んで、自分に蚀い聞かせおください、それはずおも難しいですか たぶん異垞なのでしょうか すべおのテストに勇敢か぀ストむックに合栌した人のために、読み続けるこずを提案したす。



EXIFデヌタ



ここではメむンの蚈算プロセスを終了し、EXIFから写真の時間デヌタを抜出する機胜を蚘述したしょう。 このために、別のPhotoモゞュヌルが䜜成されたした。 なぜ分離するのですか それは私の本胜によっお私に指瀺されたので、これは写真を扱うためのモゞュヌルであるず想定されおいたす、突然私の゜フトりェアは远加機胜で成長したすか その゜ヌスを芋おみたしょう。







  1. モゞュヌル写真
  2. getTime
  3.  ここで
  4. むンポヌトデヌタ 。 時間
  5. System.Localeのむンポヌト
  6. Graphics.Exifをむンポヌトする
  7. getTime :: String-> IOたぶん日 
  8. getTime filePath =
  9. fromFile filePath >> =\ e-> getTag e "DateTime">> =return。parseDateTime
  10. どこで
  11. parseDateTimeちょうどstr= parseTime defaultTimeLocale "YmdHMS" str
  12. parseDateTime Nothing = Nothing
*この゜ヌスコヌドは、 ゜ヌスコヌドハむラむタヌで匷調衚瀺されたした。




怖い たったくありたせん。 今回はモゞュヌル定矩で、括匧内にgetTime関数の名前を指定したこずに泚意しおください。 モゞュヌルの倖郚からアクセスできる機胜はここに瀺されおいたす。 C \ C ++のフラッシュヘッダヌファむルの代わりに、シンプルで゚レガントな゜リュヌションを玹介したす。



getTime関数に泚意しおください。 匕数ずしおファむルパスを取り、 Dayになる可胜性のあるアクションを返したす。 倚分それは䜕らかのキヌワヌドではなく、2぀の倀を取るこずができる非垞に明確なタむプですJust SomethingたたはNothing。 結果ずしお、関数が倀の範囲から特定の倀を返さない堎合、このデヌタ型が䜿甚されたす。 たずえば、指定された条件に䞀臎するリスト内のアむテムを怜玢したす。 そのような芁玠はそうではないかもしれたせん。



ここで、Maybeの存圚は、このファむルに時間デヌタがない可胜性があるこずを瀺しおいたす。 日は、Haskellの時間を衚すデヌタの䞀皮です。 getTime関数の定矩぀たり、方皋匏の右偎は、私たちにずっお新しい抂念をさらに2぀玹介したす。 しかし、たず最初に。 getTimeは3぀のアクションで構成されおいるこずがわかりたす。



たず、怖くお物議を醞す蚀葉が戻っおきたす。 実際、Haskellに戻っおも䜕も返されず、関数の定矩を非垞に間接的に参照したす。 returnは、枡された倀をactionに倉換する単玔な関数です。 実際には、実行がアクションのチェヌンの実行である関数は、「玔粋な」倀を返すこずができたせん。 このストリングを取埗するこずは特定のアクションチェヌンを実行するこずによっおのみ可胜であるため、「単なるストリング」を返すこずはできたせん。぀たり、このストリング自䜓を取埗するこずはアクションでもあるため、結果の倀をモナドにラップする必芁がありたす。 「返品」返品を受け取った堎所に。 これはモナドから取埗されたもので、それをモナドに返すラップする必芁がありたす。 戻り倀に関しおモナド関数は、その䞭で定矩された最埌のアクション、぀たり この堎合、ただ戻りたす。

第二に、ドット蚘号は機胜の組み合わせです。 fy = z; gx = y;



fy = z; gx = y;



それから(f . g) x == f( gx ) == z



。 2番目のアクションの結果ずしお、日付を持぀文字列を取埗し、関数自䜓がDayを返す堎合がありたす 。 したがっお、この文字列を最初にparsimにするこずができたす。その結果、明らかに、日付がある可胜性があるこずが刀明し、それを返したす。 実際、最埌のアクションは次のように蚘述できたす。

\ str -> return (parseDateTime str)







最埌に、whereブロック。getTimeの定矩で䜿甚したparseDateTimeを説明したす。 whereブロックは、たずえばコンテキスト関数を定矩したす。 それらの範囲は、このブロックが発生する特定の定矩によっお制限されたす。 これらのコンテキスト関数では、芪関数の入力匕数にアクセスできたすし、アクセスする必芁がありたす。 この堎合、このようなコンテキストの関数は、倀を解析する関数です。 Just and Nothingを䜿甚しお、2぀のテンプレヌトの2぀の匏で衚珟する必芁があるため別の方法では、その定矩をgetTimeの定矩に盎接代入するこずが可胜、別のブロックに配眮したす。 最初のケヌスでは倀を解析し、2番目のケヌスでは再びNothingを返したす。 同意したす、はっきりず



時間抜出機胜は終了したした。 ディレクトリをバむパスできたす。



機胜2-ディレクトリトラバヌサル





叙情的な䜙談。 Haskellは、呜什型蚀語の問題解決に慣れおいる方法ではなく、少し違った考え方をさせたす。 たずえば、ファむルがあるディレクトリを巡回する堎合、Cプログラマヌは次のように蚀いたす。「ルヌプでファむルを調べおAをチェックし、Bを実行したす」。 ただし、関数型蚀語のプログラマヌは、「ディレクトリ内の各ファむルに凊理機胜を適甚したす」ず蚀いたす。



あなたの思考を少し再構築するず、倱われたサむクルを埌悔するのをやめたす。 関数型蚀語では、それらは畳み蟌みず「マップ」によっお正垞に眮き換えられたす。 ここでは畳み蟌みは必芁ありたせん。説明に煩わされるこずはありたせん。 マップ機胜に぀いお説明したす。 意味で最も近いロシア語は「マッピング」であり、これは実際にそうです。 map関数は、あるデヌタセットを別のデヌタセットにマップしたす。 入力ずしお、タむプaの芁玠のリスト、タむプa-> bの関数そしお、どのように関数型蚀語であるか、ここで関数を匕数ずしお枡すこずができたすを受け取り、最埌にタむプbのリストを取埗したす。 マップ関数のタむプは次のずおりです。



map :: (a -> b) -> [a] -> [b]







最初の匕数の括匧に泚意しおください。2番目の匕数は関数そのものであるず報告されたす。 䞀般的に、Haskellでは、すべおの関数は実際には単䞀の匕数の関数であり、結果ずしお、それらのいく぀かは倀ではなく関数も返したす。 远加機胜を怜蚎しおください。



add :: Int -> Int -> Int







そのタむプは、次のように正しく蚘述する必芁がありたす。



add :: (Int -> (Int -> Int))







違いを感じたすか したがっお、 add 5 2



は倀7を返したす。ただし、 add 5



、Int型の倀を取り、Int型の倀を返す関数を返したす。 このような奇跡に基づいお、マップ機胜を䜿甚する原理が構築されおいたす。 これは、元のリストのすべおの芁玠に1を远加する方法です。



map (+ 1) [1,2,3]







しかし、Haskellのチュヌトリアルで同様の䟋を芋぀けるこずができたす。 矊に戻りたしょう。 カタログ内の芁玠のリスト党䜓で、完党に同䞀のアクションを実行し、これらのアクションの結果のリストを取埗する必芁があるこずが明らかになりたした実際、それは少し間違っおいたすが、問題ではありたせん。 感じたすか これは、マップの適甚が芁求される堎所です。 ただし、最初に、カタログの各芁玠で䜕を行う必芁があるかを刀断したす。







次に、元のコヌドの䞀郚を意図的に削陀したたは「擬䌌コヌド」プラグに眮き換えお、最も重芁なコヌドのみを残したす。 これを省略しながら、このレコヌドがディレクトリであるかどうかに぀いお䜕らかの情報を芋぀けたず想像しおください。 次に、次の凊理機胜を怜蚎したす。







  1. -芁玠の凊理カタログの堎合-再垰を入力、それ以倖の堎合は写真を凊理したす
  2. processSingle :: String 、Bool-> IO
  3. processSinglepath、True= processDirectoryパス
  4. processSingleパス、False= do
  5. picturesDir <-getPicturesDir
  6. maybeDate <-getTimeパス
  7. copyPhoto picturesDir maybeDate
  8. どこで
  9. -安党なコピヌ
  10. copyPhoto pictures Nothing = return 
  11. copyPhoto pictures日付のみ= do
  12. let NewPath = pictures ++ "/" ++formatTime defaultTimeLocale "Y /B /d"日付
  13. copyFileパスnewPath
*この゜ヌスコヌドは、 ゜ヌスコヌドハむラむタヌで匷調衚瀺されたした。




そこで、関数processSingleを取埗したした。 匕数ずしお、2぀の芁玠のタプル぀たり、倀のペアを取りたすファむルシステム芁玠ぞのパスず、それがディレクトリであるこずのサむン。 パタヌンマッチングを䜿甚しお、関数を2぀の方皋匏に分割したした。1぀目はディレクトリ甚、2぀目は再垰甚、2぀目はファむル甚です。 ここでは、アクションの蚘法に぀いお最初に玹介したす。



叙情的な䜙談。 その瞬間たで、特別なアむコンで区切られた䞀連のアクションを「次々に」蚘録したした。 これは、たずえば、アクションから抜出された倀のテンプレヌトず「オンザフラむ」で比范する必芁がある堎合など、必ずしも䟿利ではありたせん。 たたは、より頻繁に起こるこずずしお、2぀のアクションを実行し、それらの結果を3番目の関数に転送する必芁がありたす。 ここで、do-notationが助けになりたす。これは、実際には初心者の目に優しいです。 以䞋に2぀の同等のコヌドを瀺したす。







  1. foob​​ar = action1 >> = action2 >> = action3
  2. foob​​ar '= do
  3. result1 <-action1
  4. result2 <-action2 result1
  5. action3 result2
*この゜ヌスコヌドは、 ゜ヌスコヌドハむラむタヌで匷調衚瀺されたした。




この堎合、2぀の異なるアクションの2぀の結果のみが、3番目の関数の匕数ずしお䜿甚されたす。 コピヌ機胜は簡単です。日付が芋぀かったら、テンプレヌトで再床照合し、ファむルをpath



からnewPath



コピヌしたす。 2぀の機胜に泚意しおください。



formatTime



は、明らかに、ロケヌル、パタヌン、および日付を受け取り、そのパタヌン甚にフォヌマットされた日付の文字列を返す関数です。

++



はリスト連結関数です。



突然、関数3に぀いお説明したした。 本圓に簡単ですか したがっお、関数番号2はどのようになりたすか。 次のようになりたす。







  1. processDirectory :: 文字列 -> IO
  2. processDirectory dir =
  3. getDirectoryContents dir >> = checkItems >> =mapM_ processSingle
  4. どこで
  5. -ディレクトリの内容の特定のリストに぀いお、各芁玠のマヌカヌ「ディレクトリ」を含むタプルを返したす
  6. checkItems xs = mapM singleCheck xs
  7. どこで
  8. singleCheck path = do
  9. isDirectory <-doesDirectoryExistパス
  10. return パス、isDirectory
*この゜ヌスコヌドは、 ゜ヌスコヌドハむラむタヌで匷調衚瀺されたした。




これをよく芋おください。実際、これは非垞に単玔な関数です。しかし、最初に、mapMずmapM_に぀いお少し説明したす。



叙情的な䜙談。䞊蚘で説明したmap関数は、クリヌンなコヌドでのみ機胜したす。コヌドはモナドですので、モナドマップを䜿甚する必芁がありたす。これらの関数のタむプを考慮しおください。

mapM :: (a -> IO b) -> [a] -> IO [b]

mapM_ :: (a -> IO b) -> [a] -> IO ()









それらは玔粋なマップずたったく同じ意味を持ちたすが、出力では玔粋な倀ではなく、これらの倀を返すアクションを提䟛したす。最初のケヌスでは、特定の各倀を凊理した結果に関心があり、凊理された倀のリストを生成するアクションを取埗したす。2番目のケヌスでは、凊理の結果に関心がなく、アクションを完了する必芁がありたす。



したがっお、コヌドを䞋から䞊に読みたす。



そしおそれだけですおわりプログラムの準備ができたした。最埌の郚分の前に、GUIに぀いお少し説明したいず思いたす。



宣蚀型蚀語のGUI



宣蚀型蚀語ず呜什型蚀語の違いは䜕ですか呜什型蚀語では、蚈算を行う方法を蚘述する必芁があり、宣蚀型蚀語では、受け取りたいものを蚘述する必芁がありたす。宣蚀型蚀語の最も明確な䟋はSQLです。ここで、グラフィカルむンタヌフェむスに぀いお少し考えおみたしょう。実際、特定のツヌルキットの芏則に埓っお宣蚀的に衚瀺する必芁があるものを蚘述し、オブゞェクトず察話するずきにオブゞェクトがすべきこずをすぐに蚘述する必芁がありたす。



Haskellに戻りたしょう-機胜的な宣蚀型蚀語ずしお、この構造に玠晎らしく配眮されおいたす。たずえば、ボタンクリックハンドラヌを䜜成するには、匕数ずしおハンドラヌ関数を枡すだけで十分です。そしおそれはずおも自然です。Haskellでむンタヌフェヌスを䜜成するには、GTKを䜿甚したす。これは次のように行われたすGladeでフォヌムを描画し、Haskellコヌドでハンドラヌを配眮したす。



タスクの簡略化されたコヌドは次のずおりです。







  1. prepareGUI mainWindow startButton fileChooser =
  2. する
  3. onDestroy mainWindow mainQuit
  4. onClicked startButtonprocessClick fileChooser
  5. どこで
  6. processClick fileChooser = fileChooserGetFilename fileChooser >> = processDirectory
*この゜ヌスコヌドは、 ゜ヌスコヌドハむラむタヌで匷調衚瀺されたした。




圌はコメントを必芁ずしないず思う。



おわりに



プロゞェクトの完党な゜ヌスをgithub䞋のリンクに投皿したした。興味のある人は皆知り合うこずをお勧めしたす。かなり詳现なコメントを提䟛したした。結果ずしお埗られた蚘事の印象的な量にもかかわらず、私はそれを泚意深く読んだ人があなたのHaskellがそれほど耇雑ではなく、ほんの少し異なるこずを理解したず信じおいたす。それは他の原則に基づいおいたすが、それらの基瀎に基づいお、それがシステムたたはアプリケヌションのプログラミングであるかどうかにかかわらず、任意のレベルでコヌドを曞くこずはかなり可胜です。さらに先ぞ進むこずができたす少しの間、Haskellに基づいお玠晎らしいMVC Webフレヌムワヌクが生たれるこずを想像しおくださいこのチュヌトリアルでは、氷山の䞀角に觊れただけで、実際にはただ孊ぶべきこずがありたす-ポリモヌフィズム、型クラス、䞊列凊理..この蚘事を読んだ人が、少なくずもこの矎しい蚀語を孊びたいずいう欲求を呌び起こしたこずを願っおいたす。



Githubプロゞェクト

Haskell



All Articles