当我一直在学习 haskell 时,我很喜欢纯粹的部分,但现在我在 monadic 和 IO 部分中磕磕绊绊,可能正在经历一些人觉得这门语言真正令人愤怒的地方。我解决了一个项目欧拉问题,我想要一个可变数组,因为我必须经常按索引更新元素。我尝试了 Vectors,但无法让它们工作,所以我尝试了 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 对初学者如此恼火?