Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Haskell初心者がHaskellの楽しさについて語る

 Haskell初心者がHaskellの楽しさについて語る

Yuto Takamune

February 22, 2023
Tweet

More Decks by Yuto Takamune

Other Decks in Programming

Transcript

  1. Haskell初心者がHaskellの楽
    しさについて語る
    Zli 追い出しLT2023
    s1290035 しんぶんぶん

    View full-size slide

  2. Haskellって...気持ち良くないですか?

    View full-size slide

  3. なぜHaskellをやろうと思ったのか
    ● Answer: Rustをもっと深く理解したかったから
    ● Rustの型クラス(Trait)はHaskellに影響を受けている
    ● HaskellをやればRustをもっと理解できるのでは...!?という思いと、純粋関数型
    言語に慣れたくてやってみた

    View full-size slide

  4. AOJのITP1を何問か解いてみた

    View full-size slide

  5. Javaで書くと...

    View full-size slide

  6. Haskellで書くと...

    View full-size slide

  7. 気持ち良い〜〜〜〜〜〜!!!!!

    View full-size slide

  8. 解説
    ● 1~3行目: モジュールのインポート
    ● 6行目: 標準入力
    ○ getLineで読み込まれた入力を wordsを使って空白区切りでリストにし、 map (read :: String -> Int)
    でリストの中身をStringからIntに変換
    ● 7行目: 加工して出力
    ○ sort sでリストを昇順ソート
    ○ それをmap showに渡してリストの中身を Stringに変換
    ○ それをunwordsに渡して空白区切りの文字列に変換
    ○ それをputStrLnに渡して出力

    View full-size slide

  9. Javaで書くと...

    View full-size slide

  10. Haskellで書くと...

    View full-size slide

  11. 全体的にスッキリ

    View full-size slide

  12. Javaで書くと...

    View full-size slide

  13. Haskellで書くと...

    View full-size slide

  14. ん??なんで再帰???

    View full-size slide

  15. Haskellのループは基本再帰らしい
    ● Haskellにfor文とかwhile文はない
    ● ループ処理を書きたい時は再帰関数を使う
    ● flip fixを使うと手続型っぽい書き方もできるらしい
    ○ https://qiita.com/lotz/items/0894079a44e87dc8b73e

    View full-size slide

  16. いよいよ今日一気持ち良い問題

    View full-size slide

  17. まつもと先輩がC++で書くと...

    View full-size slide

  18. ちゃんと綺麗なコード

    View full-size slide

  19. これをHaskellで書くとなんと...

    View full-size slide

  20. Haskellで書くと...

    View full-size slide

  21. main関数はなんと3行!

    View full-size slide

  22. コード解説
    ● 1~4行目: モジュールのimport
    ● 7行目: 入力を全てssに読み込み
    ● 8行目: コアロジック全て
    ○ lines ssで入力を改行区切りでリストにする ・・・①
    ○ (++) <$> ["S ", "H ", "C ", "D "] <*> map show [1 .. 13] :: [String])で、S1, S2, … D13までのリスト
    を作成・・・②
    ○ //で①と②の差分リストを作成
    ○ そのリストをunlinesに食わせて改行区切りの文字列に変換
    ○ putStrに食わせて出力

    View full-size slide

  23. 気持ち良すぎだろ!!!!!

    View full-size slide

  24. 今後の展望
    ● すごいH本がまだ2章残ってるので読み切る
    ● HaskellでLispインタプリンタを作る
    ● モナディックパーサーで何か作る
    ● OCamlを履修する(Rustのために)
    次回はこのどれかのLTを話す(予定)

    View full-size slide

  25. みんなもHaskell、やろう!

    View full-size slide