将值的文本文件加载到列表列表中

时间:2014-07-27 20:18:32

标签: haskell

我有一个文本文件(data.txt),如下所示:

--#--
--#-@
-----

这是一个MAP,其中( - )是我可以去的地方,(#)是墙,而(@)是我的目标。我想将它加载到列表列表中,以便我可以通过(row,col)对其进行索引,然后遍历它(除非有更好的方法,我在这里是新手。)

我正在使用readFile,但这一次性给了我所有的一切,尝试使用.lines打破它但仍然没有工作......

我希望最终得到这样的结果:

myMap = [[-,-,#,-,-],[-,-,#,-,@],[-,-,-,-,-]]

除非我弄错了,否则这会让我做像myMap这样的事情! 0 !! 0得到[ - ]这是地图上单元格(0,0)上的CHAR(等等)。

然后我可以将它传递给一个函数并确定我可以做什么动作(显然不会移动到墙上)并尝试找到一些方法来递归移动直到我到达我的(@)等...

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您希望将字符串加载到二维地图中。你可以这样做:

import Data.Map hiding (map)

toMap :: String -> Map (Int,Int) Char
toMap = fromList . concatMap (λ(r,line) -> map (λ(c,char) -> ((r,c),char)) $ zip [0..] $ line) . zip [0..] . lines

然后使用它:

raw :: String
raw = "--#--λn--#-@λn-----"

main :: IO ()
main = do
  let myMap = toMap raw
  putStrLn $ "Map is: " ++ show myMap
  putStrLn $ "Elem in pos (0,0): " ++ show (myMap ! (0,0))