ハスケルの波乗り旅行パート1


過去数日で、人々がこのプログラミング言語を賛美するのを見ている年の後、プログラムを書くことのその表現力または副作用のない「純粋な」機能的プログラミング言語であるその純粋さについてそれをしてください.

表現力
After playing Haskellと少しでも、プログラミング言語でどれだけこのような表現力が好きかを実感できました.
さらに、私は2010年からRubyでBackgoundプログラミングと2016年以降エリクサーを持っています.私はいつも私がこれらの言語で宣言的で読みやすいコードを書くことができる方法を愛していました.
それからハスケルに会った.

種類
2000年代後半、Javaでのキャリアプログラミングを始めました.したがって、私は、タイプ宣言とどのようにいくつかのレベルの正確さを確実にするためにタイプを使う方法について熟知しています.
しかし、ハスケルを学ぶとき、私はより多くのタイプについて学ぶことができることを理解することができました.10年以上を経てduck type programming , 私は、タイプをマスターするために「精神シフト」をしなければならないと感じます.
ありがたいことに、Haskellはタイプ推論に大きな仕事をしますhttps://en.wikipedia.org/wiki/Haskell_(programming_language) , これは、型の使用に関するプロセスを緩和します.

ハローワールド
このブログ記事シリーズでは、すでにあなたがいると仮定しますthe Haskell environment installed . あなたの時間とホストストレージの利用を保存する場合は、使用することができますDocker .
シンプルなハローワールドghc :
ghc -e 'putStrLn "Hello World in Haskell!"'
これはHaskellで最も簡単なハローワールドです.ghc-e modeは式を解釈するputStrLn "Hello World in Haskell" , ネイティブコードにコンパイルして実行します.

GHCとは
「グラスゴーHaskellコンパイラ」の略です.それはmost used Haskell compiler implementation , 初期のリリースを90年代初期に持つこと.
Haskellプログラムを書くとき.hs ソースファイルghc プログラムをネイティブコードにコンパイルするにはたとえば、「Hello World」を別の「Hello World」にしましょう.Hello.hs
main = putStrLn "Hello World in Haskell!"
次に、ghc :
ghc Hello.hs
出力ファイルにバイナリコードをコンパイルして生成します./Hello , これは正常に実行できます.
./Hello
「Haskellでこんにちは世界!」ああ!🎉

手動コンパイルプロセスのスキップ
我々の最初の記憶Hello World 例:手動コンパイルプロセスをスキップするには?The -e オプションは有効なHaskell式であるため、関数呼び出しはその対象となります.
ghc app/Hello.hs -e main
呼び出しと同じです.
ghc -e 'putStrLn "Hello World in Haskell!"'

クイックソートの例
シンプルで、最適化されていないQuicksortアルゴリズムを書きましょう.Quicksort.hs
quicksort [] = []                                     
quicksort [pivot] = [pivot]                                

quicksort (pivot:tail) =                                   
  (quicksort [smaller | smaller <- tail, smaller <= pivot])
  ++ [pivot] ++                                            
  (quicksort [larger | larger <- tail, larger > pivot])    
さて、アルゴリズムを実行するには、次のようなことがあります.
ghc Quicksort.hs -e "quicksort [5, 13, 8, 1, 2, 1, 3]"

# [1, 1, 2, 3, 5, 8, 13]
Quicksortソリューションを説明するのをスキップしますが、Haskellでは基本的に次のような機能を使用します.
  • Pattern Matching
  • Recursion
  • List comprehensions

  • REPLの使用
    Haskellは、素晴らしいREPL 呼ばれるGHCi . GHCIインタプリタから、モジュールをロードし、そこから右側の関数を実行できます.
    REPLを入力します.
    ghci
    
    次に、REPLの内部でいくつかの数学を行います.
    ghci> 1 + 1
    2
    
    クイックソートモジュールをロードします.
    ghci> :load Quicksort.hs
    [1 of 1] Compiling Main       ( Quicksort.hs, interpreted )
    Ok, one module loaded.
    
    ghci> quicksort [2, 3, 1]
    [1, 2, 3]
    
    とREPLを終了します:
    ghci> :quit
    

    序曲
    REPLの中で、Haskellは自動的に基本をロードしますPrelude module などの標準ライブラリIO 複素数.そのため、プレリュードモジュールに属するすべての関数はrepl経由で使用可能です.
    # implicit
    ghci> putStrLn "hello from GHCi"
    
    # explicit
    ghci> Prelude.putStrLn  "hello from GHCi"
    

    ライティングユニットテスト
    テストは、技術やツールに不適切な工学的な実践です.Haskellは異なっており、コミュニティは、ユニットテストのための素晴らしいツールを作成しましたHUnit , Java JUnitに触発されます.
    外部のパッケージなので、ダウンロードしてモジュールをインポートしなければなりませんTest.HUnit Haskellでの最初の単体テストを実行するには.
    私たちはStack Haskellでの複雑なプロジェクトの作成と管理のための良いツールが付属しています.
    まず最初にインストールするようにスタックを設定しましょうghc 孤立した場所で、パッケージを使用するための有用なコマンドの束を与えます.
    stack setup
    
    今、私たちはHUnit パッケージ
    stack install HUnit
    
    次の単体テストTests.hs
    import Test.HUnit                                 
    
    simpleTest = TestCase (assertEqual "1 equals 1" 1 1)
    
    それから、テストを実行できます.
    stack ghc -- Tests.hs -e "runTestTT simpleTest"
    
    これは以下のようになります:
    Cases: 1  Tried: 1  Errors: 0  Failures: 0
    Counts {cases = 1, tried = 1, errors = 0, failures = 0}
    
    注意:
  • 呼び出しstack が必要です.HUnit モジュールをghc
  • the Test.HUnit モジュールは関数名を定義しますrunTestTT テストを実行するために使用する
  • 同時に複数のテストケースを定義することもできます.
    import Test.HUnit                                              
    
    simpleTest = TestCase (assertEqual "1 == 1" 1 1)                
    mathTest  = TestCase (assertEqual "10 / 5 equals 2" (10 / 5) 2)
    
    tests = TestList [
        TestLabel "simple" simpleTest, 
        TestLabel "math" mathTest]                                   
    
    stack ghc -- Tests.hs -e "runTestTT tests"
    
    また、もしあれば、テストケースごとに複数のアサーションを行います.
    import Test.HUnit                         
    
    tests = TestCase $ do                     
      assertEqual "1 == 1" 1 1                
      assertEqual "10 / 5 equals 2" (10 / 5) 2
    

    ラッピング
    このポストでは、Haskellプログラミング言語への穏やかな導入を見ました.我々はまた、どのようにセットアップを書くと、すべての現実世界プロジェクトに非常に重要であるユニットテストを記述する方法をカバーした.
    私はタイプ宣言をカバーしませんでした、しかし、それは将来のポストでカバーされます.
    また、今後の投稿では、いくつかのソケットプログラミングを行い、HaskellでシンプルなTCPサーバーを作成します.