ブックマーク / otter-o.hatenadiary.org (2)

  • データ再帰という考えと双方向リスト - 取り急ぎブログです

    今日はちょっとコードの効率化の話をいったんお休みして、別の話を書きたいと思います。 以前に書いたControl.Arrow.loopでも実はさりげなく出ていたのですが、Haskellではletとwhere節の部分でちょっと変わったことができます。 Control.Arrow.loopの定義を見てみます: instance ArrowLoop (->) where loop f b = c where (c,d) = f (b,d) ちょっと不思議な関数定義なわけなんですが、特に変わっている部分があります。…それは変数dの宣言部分です。 (c,d) = f (b,d) loopの説明によると、これの影響で変数dは再帰の全ての段にわたって同じインスタンスが参照されているということらしいです。つまり、whereとletでは定義内での変数の再帰的参照が許されているようです。 おかげで、こんなことも

    データ再帰という考えと双方向リスト - 取り急ぎブログです
  • fixを使うためのヒント - 取り急ぎブログです

    効率化の話はなんだか疲れるので、またデータ再帰の話へ脱線… id:dachs_hippoさんのfixに関する記事をボーっと読み返していてあることに気づきました… 氏のサンプルのひとつは階乗の計算だったわけですが: import Data.Function g :: (Int -> Int) -> Int -> Int g rec 1 = 1 g rec n = n * (rec $ n - 1) main = print $ (fix g) 4 ここに出てくる関数gは無理にfixを使わなくても当然かけるわけです… g :: Int -> Int g 1 = 1 g n = n * (g n - 1) main = print $ g 4 この2つを比較して見えてくることは、fixを使ったほうで出てくるgの第一引数recはほとんど関数g自身の別名のような存在だということです…逆に考えれば、f

    fixを使うためのヒント - 取り急ぎブログです
  • 1