正如我一直在學習haskell,我已經享受純粹的部分,但現在我蹣跚通過monadic和IO部分,並可能經歷了一些人真正感到憤怒的語言。我解決了一個項目euler問題,我簡單地想要一個可變數組,因爲我必須經常通過索引來更新元素。我試過Vectors,但無法讓它們工作,所以我嘗試了Data.Array.IO。我可以讀取和寫入元素,但無法以我想要的方式在終端中顯示數組。到目前爲止,我有這個。顯示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
。所以我用printf " %s," (show v)
替換了print 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對初學者如此憤怒?
只是出於好奇,究竟是想用'的printf「%S」(編譯時收到錯誤消息show v)'? – jwodder
'無法推斷(PrintfType(m a0)) 由'dispArray'的歧義檢查產生 我試過通過'::'添加類型,但是我覺得monads的類型是令人難以置信的神祕。 – DiegoNolan
Ps這是'ST'陣列的一個很好的用例。他們讓你有一個可變的東西隱藏在一個純粹的功能接口 – jozefg