如何在Haskell记录中使用IOArray?

时间:2014-01-03 16:19:00

标签: arrays haskell record

我正在尝试修改haskell.org中的示例代码,但似乎无法使其工作。

http://www.haskell.org/haskellwiki/Arrays#Mutable_IO_arrays_.28module_Data.Array.IO.29

import Data.Array.IO                                                                                          

data SomeData = SomeData {                                                                                    
  array :: IO (IOArray Int Float)                                                                             
}                                                                                                             

main = do                                                                                                     
  let d = SomeData { array <- newArray (1,255) 1.0 :: IO (IOArray Int Float) } 
  a <- readArray (d array) 1                                                                                  
  writeArray (d array) 1 64                                                                                   
  b <- readArray (d array) 1                                                                                  
  print (a,b)

1 个答案:

答案 0 :(得分:4)

你不能混合记录创建语法和monadic bind,所以行

let d = SomeData { array <- newArray (1,255) 1.0 :: IO (IOArray Int Float) } 

语法无效。您需要在单独的行上执行绑定。此外,您的字段访问权限错误,您使用array d而不是d array访问字段,并且需要从字段声明中删除IO包装。

data SomeData = SomeData { array :: IOArray Int Float) }

main = do
  arr <- newArray (1,255) 1.0
  let d = SomeData { array = arr }
  a <- readArray (array d) 1
  writeArray (array d) 1 64
  b <- readArray (array d) 1
  print (a,b)