#TaPL の第4章、普通に #Rust でも実装できそうだなと思ったので #Haskell だけでなくRustでも実装してみた。Rust慣れしていないので(コメントないのは抜きにして)Rustらしい書き方かどうかはわからんけど。 #プログラミング play.rust-lang.org/?version=stabl…
実装の一部間違えちゃってた(succ nvのときにfalseとすべきところをnvにしてた)。てへぺろ☆ play.rust-lang.org/?version=stabl…
iszero (succ nv)です。iszero (succ nv) → falseとなるべきなのですが、iszero (succ nv) → nvになっちゃってました。
ちなみにコードでは、「TmIf(TmZero, TmZero, TmPred(TmSucc(TmZero)))」と出力されてますが、これは条件部がブール値でないために行き詰まり状態となっていてこれ以上評価できないのでこれで正しいです。
succ (iszero nv) → succ v及びpred (iszero nv) → succ vとならなかったので修正しました。 #Rust に合わせるの、難しい。これで今度こそ大丈夫なはず。 #プログラミング play.rust-lang.org/?version=stabl… twitter.com/opaupafz2/stat…
E-IsZero*のガード消し忘れ。何度もお。すまん。 play.rust-lang.org/?version=stabl…
#Rust はまずボクシング(スポーツではない)されないことが前提だから、パターンマッチをするとき、ボクシングされたものだとかまでは考慮しないので、まずそこが #TaPL 第4章の実現を難しくしてるのよな。たとえば #Haskell ではeval1 TmIf(True, t, _) = Just tと書くところを、-> #プログラミング
RustではTerm::TmIf(ref t1, ref t2, ref t3) => match &**t1 { Term::TmTrue => ...}と書かなければならない。なぜならt1, t2, t3はボクシングされているからね。
#関数型言語 の再帰型やパターンマッチングの融通さもある程度オートボクシングに助けられているところがあるので、それがサポートされていないRustでは少し書き方を変えなければならない。 第4章はオートボクシングがないときついという話を聞いたが、その通りだなと思った。
まぁ、そのうえで「オートボクシングがないならBox<T>型使えば良いんじゃね?」って思ったからRustで実装しようと思ったわけだが。
match &**t1←これ自分のコードではそうではないので間違いだけど、これでも動くから別に良いや。
ぶっちゃけ、俺的にはパワハラでジサツしちゃった件も某学校の凍タヒ事件もほぼ同じでしょ。こういった明らかな加害者を守る法律なんて完全になくなればいいのにね。 子どもの未来を潰したくないとか言うけど、加害者が被害者の未来を潰してるんだよなぁ・・・