私は Haskell を学んでいるので、純粋な部分を楽しんでいましたが、今はモナドと IO の部分につまずいており、言語について本当に腹立たしいと感じる人もいるでしょう。プロジェクトのオイラー問題を解決していますが、要素をインデックスで頻繁に更新する必要があるため、変更可能な配列が必要です。ベクトルを試してみましたが、動作させることができなかったので、Data.Array.IO を試しました。要素を読み書きすることはできますが、ターミナルで配列を希望どおりに表示できません。これまでのところ、私はこれを持っています。
test = do
arr <- newArray (1,10) 37 :: IO (IOArray Int Int)
a <- readArray arr 1
writeArray arr 1 64
b <- readArray arr 1
dispArray arr
return ()
dispArray arr = do
(a,b) <- getBounds arr
printf "["
dispArray' arr a
printf "]\n"
where dispArray' arr i = do
(a,b) <- getBounds arr
if i < a || i > b
then return ()
else do
v <- readArray arr i
print v
dispArray' arr (i+1)
あなたが期待するように、これの出力はこれです:
[64
37
37
37
37
37
37
37
37
37
]
でもこれじゃ不便だし、[64,37,37,37....
こうして欲しい。のような関数を見てきましたがtoList
、これは必要ありません。表示するたびにリストに変換したくありません。だから私は使用する必要があると考えましprintf
た。だから私はに置き換えprint v
ましたprintf " %s," (show v)
。しかし、これはコンパイルされません。どうしてか分かりません。文字列を意味するのでprint :: Show a => a -> IO ()
、show :: Show a => a -> String
なぜ機能しないのでしょうか? %s
それで、私は隣同士に電話をかけました。printf が機能するかどうかを確認します。
printf " %s," "hello"
print v
コンパイルして表示するもの:
[ hello,64
hello,37
hello,37
hello,37
hello,37
hello,37
hello,37
hello,37
hello,37
hello,37
]
なぜ使えないのshow v
ですか?haskell IO が初心者を怒らせるのはなぜですか?