タグ

Haskellとfixpointに関するnsyeeのブックマーク (3)

  • モナディックなループ - maoeのブログ

    しょーもないイディオムの話。モナディックなループを書くとき、だいたい3つくらい宗派があるように思う。 {-# LANGUAGE ViewPatterns #-} module Loop where import Control.Monad (when) import Data.Function (fix) import System.Environment (getArgs) f :: IO () f = do (read -> n):_ <- getArgs flip fix (0 :: Int) $ \loop i -> when (i < n) $ do print i loop $ i + 1 g :: IO () g = do (read -> n):_ <- getArgs let loop i = when (i < n) $ do print i loop $ i + 1

    モナディックなループ - maoeのブログ
  • Haskellでメモ化を行うもう一つの方法 - 純粋関数型雑記帳

    はじめに Haskell で動的計画法を書くための3つの方針 - tosの日記 これを読んで、私もちょっと前にHaskellでメモ化をやる方法を考えていたことを思い出したので、書いてみることにします。 Haskellでのメモ化は、私のかなり昔の駄文(リアルにびっくりするほど駄文なのでご注意。メモ化の綴りも間違ってます)や、このあたりに日語の文章があります。 これらのページでのメモ化実現方針は、1. 計算済み値を保持するテーブルをMapなどを用いて用意する 2. そのテーブルを副作用を用いて更新する、というものになっています。なるほど、これは手続き型言語との対比でとても直接的な実装です。しかし、テーブルを更新するために関数全体がモナドになってしまったりして、あまり使い勝手が良くなさそうです。モナドであることを悟らせないために、演算子をモナド化したり、あるいはモナドじゃなくするためにunsa

    Haskellでメモ化を行うもう一つの方法 - 純粋関数型雑記帳
  • 不動点の話 - あどけない話

    不動点コンビネータを使うと、どうして無名関数で再帰ができるのかを考えてみる。 名前を取り去る 以下の階乗を計算する関数 fact を考える。 fact 0 = 1 fact n = n * fact (n - 1) これは、以下のように一つの式に変形できる。 fact n = if n == 0 then 1 else n * fact (n - 1) さらに、ラムダ式に変形できる。 fact = \n -> if n == 0 then 1 else n * fact (n - 1) ここで、fact という名前は使えないので、関数を引数に取るように変更してみる。 fact = (\g n -> if n == 0 then 1 else n * g (n - 1)) fact (※1) 不動点登場 ※1 の無名関数を h で表すとする。 fact = h fact (※2) ここで、x

    不動点の話 - あどけない話
  • 1