不能在Haskell数据结构中列出一个列表

时间:2017-03-30 12:07:08

标签: arrays haskell

下面的代码有一个数据结构Bot,其参数值类型为[Int]。函数giveValue从散列映射中检索给定索引的机器人,向该bot的values参数添加值并返回更新的散列映射。但是,它当前替换现有的Int in值,而不是附加到数组。有人可以向我解释为什么会这样吗?

import Data.List.Split
import Data.List
import Data.Map (Map)
import qualified Data.Map.Strict as Map

data Bot = Bot {values :: [Int], low :: Int, high :: Int}
instance Show (Bot) where
    show b = show (values b) ++ " " ++ show (low b) ++ " " ++ show (high b)


getBot :: Int -> Map Int (Bot)-> Bot
getBot i m
    | (length bots == 1) = bots !! 0
    | otherwise = Bot [] falseVal falseVal
    where
        falseVal = -1
        bots = [b | (i2, b) <- Map.toList m, i2==i]


giveValue :: Int -> Int -> Map Int (Bot) -> Map Int (Bot)
giveValue botInd val oldM = newM
    where
        bot = getBot val oldM
        newM = Map.insert botInd (Bot (val : values bot) (low bot) (high bot)) oldM

main = do
    let bot = Bot [17] 3 4
    let bots = Map.insert 0 bot (Map.empty)

    print $ giveValue 0 61 bots  
    -- Prints fromList [(0, [12] -1 -1)]

1 个答案:

答案 0 :(得分:6)

我认为您的意思是bot = getBot botInd oldM而不是bot = getBot val oldM

编译器可能已经抓住了这个,除了你使用Int作为你要放入的值的类型以及你如何查找机器人。

也许如果您将整个Bot传递给giveValue,那么您可以确定您为正确的机器人提供了正确的价值吗?

您也可以将“bot id”包装成新类型,例如newtype BotId = BotId { unBotId :: Int }getBot会占用BotId,然后ghc会抱怨你输入的是整数而不是id!

另外,请考虑对Maybe IntInt使用low而不是high。您使用falseVal的事实是一个很大的红旗,您应该使用Maybe代替。