下面的代码有一个数据结构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)]
答案 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 Int
和Int
使用low
而不是high
。您使用falseVal
的事实是一个很大的红旗,您应该使用Maybe
代替。