中級プログラマを目指す

底辺学生プログラマが中級プログラマを目指し、学んだことや思ったことを書き連ねるブログ。まさかり大歓迎。

Haskellでつまずいた所まとめ

Haskellを学ぶ上でつまずいた所まとめ
Twitter上で#1ふぉぼごとにHaskellでつまずいたところを語るで出てきたもの一覧とも言う

  • 適切な入門記事がない
    Haskellをさらっと体験してみたくてWebでHaskell入門記事を読むもやる気がない(Haskellの凄さを感じられない)記事かやる気がありすぎる(初学者にとっては壁が高すぎる)記事の2つに1つでアッってなった 結局7shiさんの記事にお世話になりました

  • stackによる環境構築
    環境構築につまずく というのもstackの進化が早すぎて一次ソース以外信用ならんという大変な自体が原因 大半の日本語記事がすでに古くあてにならないというのは完全に一種の罠である

  • ライブラリの使い方、Hackageの読み方
    またHaskellというかstackの問題だけど、ライブラリのインポート方法がわからない問題
    いや、Control.MonadはbaseだけどControl.Monad.Stateがmtlとか初学者にはちょっとよくわからないよ

  • $.
    $( . )を使いこなすのに苦労した 意図と違う挙動をしてなんでだって考え込んだことは多数である

  • 型コンストラクタとkind
    型コンストラクタ周りも理解するのに中々時間がかかった。* -> * とか摩訶不思議

  • 型クラスの使い方
    型クラスは使いこなすのに結構たいへんだった なんどno instacesうんぬんと見たことか

  • Monadへの理解
    みんな大好きMonad 圏論を学び始める羽目に 結局Monadがcomputationであるということを理解するのに非常に時間がかかった
    世のMonadチュートリアルはそびえ立つ糞の山
    MonadはComputationの一言さえあればこんなに悩むこともない

  • StateとST
    State, STの使い所や使い分け だれでもつまずくはこんなん

  • モナド変換子とはなんなのか
    モナド変換子 某氏のモナドモナドの記事を読むことによってスッキリ解決したがそれまでなんとも言えないもやもやを抱えていたものである

  • パフォーマンスを考えた評価戦略
    パフォーマンスのためにサンクを潰す話とかは何回も考えて飲み込んだ記憶

  • 適切なライブラリの選択
    ライブラリが乱立し戦国時代 何が良いのかわからない 逆に全く存在しないことも多々

  • Category, Arrowの使い所
    Category, Arrowの使い所さんがわからない このライブラリの作者天才だと思ってる

  • 3つのforall
    forall多すぎ問題 貴様どこのシマのforallだ! 存在量化子とかもわからなかったのでTaPLことに

  • DataKindとは???
    DataKindが無限にわからない これは一体という気持ちになる 高階多相とかを理解するのもかなり時間がかかった

  • Optics関連
    Optics(Lens, Prism) 使う分にはいいんだけどその圏論的背景と中身の実装がやばい 現在進行形で解読中

  • ByteString
    ばいとすとりんぐに苦しむのはHaskellerの嗜み

  • 遅延入出力
    Lazy IO これはつまずきポイントすぎて熟練のHaskellerも避けるレベル 使うなというのが一般的 Conduit使おう

  • 記号多すぎ問題
    <$> <.> >>= >>> <<< &&&& >=> …… 記号の多すぎて覚えきれん

  • 関数型設計
    いざ作ろうとするときにどういう設計がいいのかわからないという問題
    自分のスタイルを確立してるけどそれでいいのかもわからんし、誰か論理に立脚した関数型設計の本とか出して

  • NFA
    非決定性オートマンから作ろうとすると今まで学んだことが結びついてなくて止まった (ネタ切れで適当になってきた)

  • CPS
    継続渡し、使うぶんにはいいけど動作がイマイチ理解しきれなかった

  • 不動点コンビネータ
    普通にむずい 理解するまで時間がかかった

  • Rank N types
    forallの話とかぶる TaPLがなければ即死だった

  • GHCの気持ちがわからない
    GHC「その型推論はできんのや」 ぼく「アッ(絶命)」

  • 型レベルプログラミング
    型レベルプログラミングでの証明 いよいよやばい世界に来たと恐怖を覚えた
    あと文献が散逸してて、体系的に入門できない

  • 型レや型族まわりの情報収集
    いよいよ文献が論文ばっかになって来たぞ(白目)

  • ekmett神の神託(ライブラリ)の解読
    ekmett先生のライブラリの解読 なんだその発想は意味わからんとなる

  • ストリーム
    初心者ぼく「一体何が一番なんだ???」

  • パフォーマンスチューニング
    空間計算量、時間計算量などの割とGHC依存なところが大変
    関数型プログラミングの思考法に詳しく書いてあったはず

  • やはり圏論は必要
    論文、ライブラリのドキュメントで平然と使われる圏論
    さらに圏論に詳しくならないといけないというわけわからん自体
    圏論的意味論なんて……なんて……大好きだ!

  • fold
    畳み込みとCatamorphismの対応 結構考えたような気がする

  • 最適化レベル
    各最適化レベルでのGHCの挙動 つまずきポイントというか覚えるのめんどくさいポイント
    正直今でも適当

  • 演算子のinfix
    自分で作ったものにどうつけるかがわからなかった
    これも未だに適当

  • GHCGCの動き
    いまでもよくわかってない

  • Profunctorの使い所
    いやこんなん普通わからないでしょ
    ありがとうLens

  • >>の存在意義
    Monadが分かったらすっと分かるように

  • アルゴリズム
    手続き型のアルゴリズムを関数型に書き直す まぁそれなりに苦戦する 今でも
    珠玉のアルゴリズムとか読むといいのかもしれない

  • GUI
    正直GUIはどの言語も辛いしつまずくところ
    使いやすいライブラリが欲しいし、作るかという気持ち

  • ghc-ios(番外)
    正直結局Swiftで書かないといけなくてダメでした

  • 関数従属
    普通に難しい
    どうしても難しい説明になってしまいがち

  • 理論とコードの結びつけ
    TaPLや圏論の知識とHaskellGHC拡張周りとの対応付け
    基本的にココらへんの説明してくれるような記事はあんまない

  • ライブラリを読む
    ドキュメントの型をみてこれ、圏論のあれかと推測するの
    かなりの慣れが必要だし未だに苦戦してる

  • 練習用の題材
    練習でなにか作ろうとしてもHaskellの力をフルで発揮できる題材が思いつかない ……思いつかない

  • TwitterのHaskeller強すぎ問題
    TwitterのHaskellerが平然と型レベルプログラミングとかしててやばい
    おそらく心折れポイントはかなり高い部分
    彼らは何をどうやってそこまで行ったのか?
    同じレベルの同志を見つけたい

  • 初心者がそもそもいない
    あまりに怖い言語だという評判が根付いてしまってるので初心者仲間が増えない
    増えないのでモチベが保てない

  • 中級者になるために必要なことがわからない
    中級者向けに何をやればいいかの情報がない
    細部に関する情報はあっても体系的なお話がね……
    モナド変換子, Eff, Lens, Prism使えれば中級者という見解をもってるので、それやればいいと思う

  • 深い記事の必要性
    各コンテンツの深掘りした記事などがない
    それもそう、深掘りできるほど頭の良い人材が記事を書かないのである!

  • テストの話
    Haskellに関するテスト関連の話題が皆無
    文献でも確認したのは関数型実践入門だけ

  • 数学の知識
    圏論だけじゃなくて基礎的な代数学の知識も必要

  • 型パズル
    頭のなかで型の組み合わせをする
    これはなになにのインスタンスで……これは存在型にしないと……これは依存型に…… できるか!
    強い人達絶対数式で設計してるでしょ!

以上
思いついたらまた随時追加しますが、この時点でつまずきポイントが多すぎる(白目)
後々各つまずきポイントの解決策を(分かるところだけ)書いていく