[英]Cannot cons to a list in Haskell data structure
下面的代码具有一个数据结构Bot,该数据结构的参数值类型为[Int]。 函数GiveValue从哈希图中检索给定索引的漫游器,将值添加到该漫游器的values参数中,并返回更新后的哈希图。 但是,当前它替换现有的Int值,而不是追加到数组。 有人可以向我解释为什么会这样吗?
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)]
我认为您的意思是bot = getBot botInd oldM
而不是bot = getBot val oldM
。
编译器可能已经捕捉到了这一点,只是您将Int
用作要输入的值的类型以及查找机器人的方式。
也许,如果您改为将整个Bot
传递给giveValue
,那么您可以确定是否为正确的机器人赋予了正确的价值?
您还可以将“机器人ID”包装为新类型,例如newtype BotId = BotId { unBotId :: Int }
。 getBot
需要一个BotId
,然后ghc会抱怨您传递的是整数而不是id!
另外,请考虑使用Maybe Int
代替low
和high
的Int
。 您正在使用falseVal
的事实是一个大的红旗,您应该改为使用Maybe
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.