scalazにおけるimplicit parameterの命名規則

たまに話題になるし、まとめておけば役に立つ気がしたので。 最初ScalazというよりFP in Scalaの話だけどまぁ気にしない。
0
抑圧されているんだ @writeboostguy

Scala質問: def f[A](A: Monoid[A])における, 2番目のAは型を表してるの?例えばIntとか

2015-06-12 07:43:10
抑圧されているんだ @writeboostguy

A: Monoid[A] って型が再帰してるように見えるのだが, どういう記法なんだ?

2015-06-12 07:47:15
抑圧されているんだ @writeboostguy

a: Monoid[A]と書くものではないの?紛らわしいので.

2015-06-12 07:47:52
抑圧されているんだ @writeboostguy

なんでこんな紛らわしい書き方するのだと小一時間悩んだ. A: Monoid[A] の1

2015-06-12 07:49:02
抑圧されているんだ @writeboostguy

つ目のAと, 2つ目のAは関係がない・・・2つ目のがIntならば, 1つ目はMonoid[Int]のインスタンスですよと言ってるだけか

2015-06-12 07:50:03
がくぞ @gakuzzzz

@writeboostguy 2番目のAはただの引数名ですね。

2015-06-12 13:21:55
抑圧されているんだ @writeboostguy

@gakuzzzz Thanks. やっぱそうですよね. 紛らわしいのでmaとか書けばいいのにーと思いました.

2015-06-12 14:51:16
がくぞ @gakuzzzz

@writeboostguy 全く同意ですね。この辺 Scalaz でもFPinScalaのような命名規則なんですが、github.com/scalaz/scalaz/… 個人的にはこれは Haskell 文化圏から引き継いだ悪しき風習な気がしています。単純に読み辛い……。

2015-06-12 15:00:58
抑圧されているんだ @writeboostguy

@gakuzzzz 型が再帰してるように見えて混乱します. Scalaって型を引数にとれるのか?とも思いました. 文化なので改善は無理そうですね. 慣れ従うしかりません.

2015-06-12 15:03:08
がくぞ @gakuzzzz

@writeboostguy 慣れは多分にありそうですねー。ただまぁScalaコミュニティ全体がそういう文化という訳でもなさそうなので、この辺はよりよい提案を出して行けば受け入れられる余地はあるように思ってます

2015-06-12 15:05:58
Kenji Yoshida @xuwei_k

@gakuzzzz @writeboostguy Haskellではそもそも型クラスのインスタンスの実体はScalaみたいなオブジェクトとして存在しないので、(名前つける行為自体を避けるため)型クラスのインスタンスは型と同じ名前にするというのはある意味Scalaz独自の慣習ですね

2015-06-12 15:07:33
がくぞ @gakuzzzz

@xuwei_k @writeboostguy あーそれはそうなんですけど、例えば liftM :: (Monad m) => (a -> b) -> m a -> m b liftM f m = m >>= (\x -> return (f x))

2015-06-12 15:12:20
がくぞ @gakuzzzz

@xuwei_k @writeboostguy の m a 型の変数にmとつける、とか個人的にHaskellの読み辛さはこういう所か来てるように感じてて、Scalazのそのルールはそれを引き継いでる様に感じてます。

2015-06-12 15:12:30
Kenji Yoshida @xuwei_k

@gakuzzzz @writeboostguy 名前付け避けれる機械的な命名規則ならなんでも良かったんでしょうけど(順番にev1とかev2とか)scalaz7のプロトタイプ作った人がその規則をドキュメントに書いて(別にみんなこだわりないので)それに従うようになって今に至ってます

2015-06-12 15:13:20
Kenji Yoshida @xuwei_k

@gakuzzzz @writeboostguy あ、はい。もちろん短い機械的なわざと意味のない名前付ける文化の大枠自体は、主にHaskellの影響だとは思います

2015-06-12 15:14:39
がくぞ @gakuzzzz

@xuwei_k @writeboostguy 本当に使わないのであればContext Boundで済むので、名付けを避けるのがバッドノウハウな気がするんですよねー。コード中で明示的に使うんだから識別しやすい名前をつけて欲しい感あります。ってここでいうより提案しろって話ですがw

2015-06-12 15:17:36
がくぞ @gakuzzzz

熟練Haskellerは型を扱うコードと値を扱うコードを無意識レベルで分けてるので型名と同じ変数名とかあっても混乱しないんだろうなー という気がしてる。まーScalaもコンパニオンobjectとか境界があやしいやつあるけど

2015-06-12 15:21:09
Kenji Yoshida @xuwei_k

@gakuzzzz 型さえ分かれば型クラスのインスタンスが一意に定まるので、その名前なんて考えたくないというか考えるべきではないという思想のはずなので、まぁ がくぞーさんとscalazの考えは相容れないので、どうしようもないという結論(?)

2015-06-12 15:21:26
がくぞ @gakuzzzz

implicitly がもうチョイ楽に書ければそっちの方がわかりやすいのではないか感ある

2015-06-12 15:24:22
がくぞ @gakuzzzz

つっても僕も適当に ev1 とかつけてますてへぺろ

2015-06-12 15:26:04
Kenji Yoshida @xuwei_k

@gakuzzzz あー、そのためにscalazはコンパニオンにapplyあって、ほぼ全てをcontext boundとそれで済ませることは可能なのでそれでもいいんです。が、そのあたりの規約は特になくて、両方ごぎゃ混ぜなのは整理してもいい、が誰もその整理に興味ないので混ざったまま

2015-06-12 15:27:19
がくぞ @gakuzzzz

@xuwei_k そうそう、Scalazのあのコンパニオンのapplyはいいしくみだなーと思ってます。オーバーヘッドとか気になっちゃってそっちに統一すべしみたいな提案ははたして良いのか?と悩んでみたり

2015-06-12 15:29:30
Kenji Yoshida @xuwei_k

@gakuzzzz 仮にそこを整理するpull reqが来たとして、他の人の反対がなければmergeして統一してもいいけど、結局自分もその整理どうでもいいので(?)、オーバーヘッドもそうだし、gitの履歴が無駄に増えるというデメリットもあるので放置してる感じですね

2015-06-12 15:31:53
Toshiyuki Takahashi @tototoshi

@gakuzzzz @xuwei_k がくぞーさんzが4つもついてるのに...

2015-06-12 15:32:07