Haskell, Go 所感
色々な言語に触れるのは新しい考え方とか概念とか理解出来て個人的に良い事だと思ってる
更なる新たな技術が出てきた際に、元ある知識を適用したり応用する事で大凡の理解に繋げる事が出来ると思うからだ
HaskellとGoに軽く触れたので所感
Haskell
前提
そもそもHaskellを書く気は全く無く、実際コードも対話型環境で少し試しただけで、主にやったことはすごいHaskellたのしく学ぼう!を読んだだけだ
Haskellからはこの言語が持つ特有の概念を学びたかった
Scalaに触れる中で様々なHaskellの(関数型の/圏論の)概念に触れる事がある。時にはHaskellで書くとこのように書ける、といった例示がある一方でその例が理解出来ないのは残念だった。
Scalaに触れていたからこそ、ある程度の理解が容易になったように思う。そもそもHaskellの概念を学びたい、というのもScalaをもっと学びたいから、といった欲求から出たものだ。
以前にもモナドは象だ - decadenceあたりで同様の学びを得ようとしていたが、初めからこちらの本を読めばよかった、といった結論もある
学び
すごいHaskellたのしく学ぼう!から得た学びは以下の通りである。
自分用に思い出そうとする際のメモも残す
- 型クラス
- インタフェースに近く、ふるまいを表すもの。対応する型において各々の実装(インタフェース)が必要になる
- 型コンストラクタ
- ジェネリクスに対して前提させる型クラス
- 値コンストラクタ
- `data Bool = True | False` の True, Falseの方
- 型シノニム
- type
- (Haskellでいう)インタフェース
- 型クラスの各型における実装
- ファンクタ (Functor f)
- `fmap :: (a -> b) -> f a -> f b`
- アプリカティブ (Functor f)
- `pure :: a -> f a`
- `(<*>) :: f (a -> b) -> f a -> f b`
- モノイド
- `mempty :: m`
- `mappend :: m -> m -> m`
- `mconcat :: [m] -> m`
- モナド (Monad m)
- `return :: a -> m a`
- `(>>=) :: m a -> (a -> m b) -> m b
- モナドプラス (Monad m)
- `mzero :: m a`
- `mplus :: m a -> m a -> m a`
- guard
考察
そもそもHaskellにはOOPでいうクラスが存在しない、というのを常に念頭に置きながら理解しようとするとなるほど、といった事が多かった。逆にJavaなどにあるクラスとの対比を行うと理解出来ない箇所も多々あったように思う。
Scalaで型クラスを実装、といった例をたくさん見るが、きちんと理解出来ていなかった事が多かった。一方で例えばScalazのOptionTのこの部分などで、何をしているのかというのを理解出来たように思う
Haskell自体を書く気はないが、すごいHaskellたのしく学ぼう!は大体1日で通して読めた上に学びが多かったので非常に良かった。
golang
前提
なぜGoをやろうと思ったのか、については"なんとなく"としか言えない
思い当たる節はある。プログラミングを始めたのが大学の講義からという浅い経験の中で、プログラミングに興味を持ち始めてからもOOP的観点から言語の強力な恩恵を受けたものばかり使っており、OOP的でない所(特にCなど)から、ポインタを使う言語などの学びが欲しかった用に思う。言ってて良く分からんくなってきたからやめよう
以前に軽く手をつけていたものの忙しくなって放棄していたが、A Tour of Goをまた一からやり、一晩寝かしつつ先ほど一通り終わった
考察
言語を学ぶ上で必要になるツールが予め用意されているのは非常に良い
WebUIでコードを書くのは最悪だが、Emacsを起動してコードを書くとWebUIで感じていた不快感が全て吹き飛んでしまった
並列処理も並行処理も気楽に書けるのが嬉しい
並行処理をする際に、すぐにdeadlockになってしまうのできちんと頭を使いながら書かねば
自分の事ながら普段頭あまり使わずにコード書いてるの、見なおした方が良いと思う
最後の問題に関して、少し躓いたものの一応形になるものは出来たように思う
https://gist.github.com/f94c54678bc02224a8f5
A Tour of Go - Exercise: Web Crawler
書いていて楽しさのようなものがGoにはあった。が、いつ使うのか、と言われて何もない
Haskellは書かないが、Goは書けたらもう少し書く予定