乱数の種をOSから取得するのは純粋じゃない
seedから乱数を計算する関数は純粋。
アルゴリズムで焼きなまし法みたいなのなかったかな
foldlという関数を見ると、いろいろと話したくなるのがHaskellerの性なのだけど、まあすごく簡単に言うと、「昔はスペースリークの関係でfoldlではなくfoldl'を使えと言われていたけど、今はfoldlとfoldl'は同じものなのでfoldlを使えばいい」という話で、一周して意味のない話になる。
スリープソート
リストを返す版
{-# LANGUAGE BlockArguments #-}
import Control.Concurrent
import Control.Concurrent.STM
import Data.Function
sort :: [Int] -> IO [Int]
sort ns = do
c <- atomically newTChan
mapM_ (forkIO . single c) ns
threadDelay 1000000
atomically $ fix \go -> do
e <- isEmptyTChan c
if e then pure [] else (:) <$> readTChan c <*> go
single :: TChan Int -> Int -> IO ()
single c n = threadDelay (n * 1000) >> atomically (writeTChan c n)
sleep sortの単純な実装。結果はstdoutに出してる。
import Control.Concurrent
sort :: [Int] -> IO ()
sort ns = do
mapM_ (forkIO.single) ns
threadDelay 1000000
single :: Int -> IO ()
single n = threadDelay (n * 1000) >> print n
カリー化って厳密に言うとHaskellで言うカリー化と他の言語で言うカリー化とは、すこしズレてるように思ったことがある。忘れちゃったけど。
スリープソートは並行実行の説明をするときに、「スリープソートというのがありまして...」みたいに、つかみとして使えるかと
Haskell Brooks Curryさんは、とりあえず3つの言語に名前を残している。
Haskell
Brook
Curry
さらにカリー化とかカリー=ハワード同型対応などなど、「名前残しすぎ」問題。
ドーナツ