Haskellの勉強で詰まってる部分

まず前提として、大量に間を割いたわけではない。週末気が向いた時にちょろっとやるぐらい。わからないと放置するので全然進んでない。

このテキストについて、名前空間の扱いやcabalについて一部批判と受け取られない表現があるかもしれないが、これはおそらく僕の無知より発しているので、わかってる人はバーカと罵っていただきたい。(この界隈、教えてといっても教えてもらえないので、罵ってもらうのが楽ではある)

あくまで現在の状況。すごいH本は読んだが全部は理解していない。頻繁に詰まるが解説を読めばなんとかなったりならなかったりしている。

モナドについて

箱のメタファは適切ではないとかなんとか言われているのをたまにみるが、自分はアレで理解している。

Functors, Applicatives, And Monads In Pictures - adit.io

問題はモナドがわかってもモナドで包まれた値の中身を変形させたりパターンマッチで剥がしたりする関数や型クラスを見つけるのに時間がかかることで、<$> とか <*> とか、え〜どっちがApplicativeで何がFunctorだっけ、そもそもその定義はなんだったっけ。え〜あ〜〜〜みたいになる。

たまにC++触ろうとして、(こっちもあんまり触れないんだけど) ポインタの概念を理解をしてるつもりでも各種ポインタを実際に操作する記法がわからなくて詰むのに似ている。あれ関数の引数等のコンテキストで発生する暗黙のキャストが辛すぎてあんまりわかってない。

あと、ふと思い出したように勉強を再開すると、何が何だったか全く思い出せない。記号や演算子がショートカットではあるが意味性が全く含まれないので、脳への負荷が高い。

名前空間

import した後の名前空間の扱いが奔放すぎる。サンプルコードをみて複数importしてるのをみると、実際に動いてるコードで登場する関数が、何に由来した関数なのか、検討がつけにくい。参照スコープが広いとそれだけで頭が爆発しそうになる。

そして名前で役割を推測することが困難な事が多々ある。mapM_ とか、前述した演算子とか。いや mapM_ は map があって mapM があって、っていう段階があるのは理解しているけど、ソース読んでて突然出現するそれには全く対応できない。

もしかしたら、プロダクションでは qualified as するのが当たり前なのか徹底的に import Foo (bar)みたいに絞るのか、それすらわからない(後者のような気はしているが)。学習段階だからモジュールなんて適当でいいやろみたいなものを見ているのかもしれない。その判断が自分でできないのがストレスが溜まる。

Cabal

辛い。sandboxデフォルトになってないのは歴史的経緯かもしれないが、それにしても辛い。

まず設定のtomlファイルの書き方がわからない。これは僕の頭が悪いからだと思うが、全く独自の文法で、toml を意図通りに書くまでに半日かかったことがある。で、動いたとして、インストールしたモジュールが冪等になってるのかよくわかってない。

依存のうち一箇所が壊れていても自分で直したり握りつぶしたり出来ないので、そうだといえばそうなんだが、それにしても全体的になんとも言えない使いにくさを感じている。あるライブラリA をインストールしたあとに別のライブラリB をインストールしたら共通の依存 C が Bによって書き換えられて A が壊れる、とか。そういうことが頻繁に起こる。僕の使い方がダメだからかもしれないが。

リリース前のストレスからまったく無関係なことしたくなって触ってた。

追記

maoe さんありがとうございます!

Re: Haskellの勉強で詰まってる部分 - maoeのブログ

大雑把に要約すると

  • エディタの入力支援で型を追う
  • import は臨機応変に
  • cabal は sandbox のみ使う

という感じらしい、です