実践Haskell 効率的でステートフルな配列 STUArrayを使って状態を変化させる、writeArray関数、when関数、真偽値
入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)のUNIT7(実践Haskell)、LESSON 42(Haskellでの効率的でステートフルな配列)、42.6(練習問題)Q42-2の解答を求めてみる。
コード
import Control.Monad
import Control.Monad.ST
import Data.Array.ST
import Data.Array.Unboxed
replaceZeros :: UArray Int Int -> UArray Int Int
replaceZeros myArray = runSTUArray $ do
stArray <- thaw myArray
let end = (snd . bounds) myArray
forM_ [0 .. end] $ \i -> do
val <- readArray stArray i
when (val == 0) $ do
writeArray stArray i (-1)
return stArray
a :: UArray Int Int
a = array (0, 4) [(1, 2), (2, 3)]
main :: IO ()
main = do
mapM_ print [a, replaceZeros a]
入出力結果(Terminal, Zsh)
% runghc sample2.hs
array (0,4) [(0,0),(1,2),(2,3),(3,0),(4,0)]
array (0,4) [(0,-1),(1,2),(2,3),(3,-1),(4,-1)]
%