計算機科学のブログ

実践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)]
%