タグ

TIPSとhaskellに関するclavierのブックマーク (5)

  • Haskell ポインタープログラミング - あどけない話

    早いもので、今年も12月25日となりました。メリークリスマス! うちのちびっ子怪獣たちも、サンタさんに書いた手紙通り、レゴをもらってご満悦のようです。 そして今日は、Haskell Advent Calendar 2013 の最終日でもあります。 Haskellらしい? 「純粋なコードで構成するのが Haskell らしいプログラムであり、IOはHaskellらしくない」という発言をよく耳にします。 確かに、命令プログラミングの世界から関数プログラミングの世界にやってきたとしたら、 不変データを使った永続データプログラミング 部品プログラミング 純粋なコードに対する性質テスト などには、衝撃を受けることでしょう。 でも、純粋なコードは、Haskell の世界の半分でしかありません。そこは、コンパイラーという保護者に守られた未成年の世界です。Simon Peyton Jones さんの言葉を

    Haskell ポインタープログラミング - あどけない話
  • Haskell でのデバッグ - あどけない話

    「純粋関数型言語はデバッグしにくい。だって純粋な関数で printf デバッグできないから」とつぶやいている人をよく見かけます。これまで放置してきましたが、リツイートが50を超えたので、Haskellでのデバッグについて書きます。 例外処理と同じように、Haskell でのデバッグでは、純粋な関数と IO を分けて考える必要あります。 IO での printf デバッグ IO では、putStrLn や print が使えるから問題ないですよね? foo :: Int -> IO Bool foo i = do x <- あれして i putStrLn $ "x = " ++ show x これして putStrLn "ここも通過" -- それもする y <- それもする print y return y ちなみに、forkIO 起動した軽量スレッドから putStrLn する場合、軽量ス

    Haskell でのデバッグ - あどけない話
  • STMで解く「食事する哲学者の問題」 - あどけない話

    Haskell で STM を使えばデッドロックがなくなる例として、事する哲学者の問題を考えてみる。 デッドロックするコード 事する哲学者の問題では、箸がロックの役割を果たす。Haskell の軽量スレッド間でロックを取るには、MVar を使えばよい。以下のコードを走らせると、その内デッドロックする。 module Main where import Control.Monad import Control.Concurrent import System.Random numOfPhilosopher :: Int numOfPhilosopher = 5 type Chopstick = MVar () newChopstick :: IO Chopstick newChopstick = newMVar () getChopstick :: Chopstick -> IO ()

    STMで解く「食事する哲学者の問題」 - あどけない話
  • Haskellの配列でクイックソート - あどけない話

    Haskell の クイックソート としては、以下のようなコードがよく例に出てきます。 quickSortList :: [a] -> [a] quickSortList [] = [] quickSortList (x:xs) = quickSortList lt ++ [x] ++ quickSortList gt where lt = filter (<x) xs gt = filter (>=x) xs これは、小さなリストを何度も連結するので、効率が悪そうです。 そこで、一旦配列に直し、固定領域を使ってソートして、またリストに戻す方がいいのではないかと思い、実装して速度を比べてみました。配列を使うクイックソートのコードは、「珠玉のプログラミング」から拝借しました。ベンチマークも含むコードは、gist に上げています。 結果はこんな感じ(単位はms): 入力のサイズ 10^4 10

    Haskellの配列でクイックソート - あどけない話
  • Haskell で可変長引数を扱う方法

    一口に可変長引数と言っても色々あります。限られた範囲でのオプション引数が欲しいこともありますし、多相的な物の可変長引数が欲しいこともあります。また、可変長引数を型安全に使いたいのか、型安全性を無視してでも使いたいのか、という話もあります。このようにどういうことをしたいかによって、可変長引数を実現するために採用するべき手段は異なってきます。ここにある程度情報をまとめておきましたので、是非参考にしてみてください。

    Haskell で可変長引数を扱う方法
  • 1