by shigemk2

当面は技術的なことしか書かない

ハピネスチャージハスケル

ごめんなさい、タイトルはノリです。

Haskellでループ

アクションを使うループ。 ちなみにアクションは型的にはIO型。

main = do
    let loop i | i < 5 = do
            print i
            loop $ i + 1
        loop _ = return ()
    loop (-5)

IORefを使うループ。

import Data.IORef

main = do
    i <- newIORef 0
    let loop = do
        i' <- readIORef i
        if i' < 5
            then do
                print i'
                writeIORef i $ i' + 1
                loop
            else return ()
    loop

通常はループの代わりに再帰を使いますが、それは参照透過性の海を汚さないため。

合計プログラム

1 + 2 + 3 + .... + nみたいなプログラムをアクションを使って書く。

import Data.IORef

main = do
    s <- newIORef 0
    let sum i | i <= 100 = do
            s' <- readIORef s
            writeIORef s $ s' + i
            sum $ i + 1
        sum _ = readIORef s
    print =<< sum 0

アクションを使わない。

main = do
    let sum s i | i <= 100 =
            sum (s + i) (i + 1)
        sum s _ = s
    print $ sum 0 1

アプリカティブスタイルを使用したフィボナッチ

もうここまで来ると完全に初見殺しで知らないと分からない。

import Control.Applicative

fib 0 = return 0
fib 1 = return 1
fib n | n > 1 =
    -- 演算子の関数化
    (+) <$> fib (n - 2) <*> fib (n - 1)

main = do
    print =<< fib 7

Haskell アクション 超入門 - Qiita