2020-08-31: Hedgehogなんも分からん
やったこと
ジャンク
ジャンクガレッジに行ってきた。
夏の終わりなので。
Scala
Hedgehogの自前実装をひたすらやっていた。
どうしてTreeを返したいのか、という気持ちは結構分かった。
shrinkの型はT => Seq[T]で、これと組にしてしまうとFunctorにすることも難しい- 引数に
Tが現れるため Invariantにすることはできるが‥‥
- 引数に
- ただ、
shrinkも同時に管理しないと、filterなどで生成されるオブジェクトを正弦したときに、shrinkでその制約を外れる値になってしまう可能性がある。 - ↑なのでどうにかして
shrinkを合成したい shrink関数を使って実際に縮小する過程を考えるとTreeになるので、Treeを返すようにするのは妥当
が、Hedgehogの実装を単純に再実装すると気になる部分もあったので、そこは直していってる。
Genの型が(Random, Int) => Tree[(Random, Option[T])]だけど、本来乱数が絡まないはずのTreeの子要素までRandomを持っているのが気になるStateT[Random, Tree, *]と考えると妥当な合成ではある- が、そこまでして
Monadにする必要があるのかあやしい - 実際、2つの
Genを組にできる処理があれば大体問題ない
- というわけで
(Random, Int) => (Random, Tree[Option[T]])に変更した- おそらく
MonadではないのでflatMapは定義されていない - これは
ReaderT[Int, Nested[State[Random, *], Nested[Tree, Option, *]], *]に同型 - なので、
Functor, Applicativeとして合法(ついでにFunctorFilterも)
- おそらく
Gen.frequencyとかは明らかに壊れているので修正
と、こんな感じ。
Hedgehogの(表面的な)再実装は大体できたので、今はCogenとかを実装して関数も生成できるようにしている。
これ地味にだが‥‥。