无法连接到Haskell数据结构中的列表

无法连接到Haskell数据结构中的列表,haskell,Haskell,下面的代码有一个数据结构Bot,其参数值类型为[Int]。函数giveValue从hashmap检索给定索引的bot,向该bot的values参数添加一个值,并返回更新后的hashmap。但是,它当前会替换值中现有的Int,而不是附加到数组中。有人能给我解释一下为什么会这样吗 import Data.List.Split import Data.List import Data.Map (Map) import qualified Data.Map.Strict as Map data Bot

下面的代码有一个数据结构Bot,其参数值类型为[Int]。函数giveValue从hashmap检索给定索引的bot,向该bot的values参数添加一个值,并返回更新后的hashmap。但是,它当前会替换值中现有的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)]
import Data.List.Split
导入数据。列表
导入数据.Map(Map)
导入符合条件的Data.Map.Strict作为映射
数据Bot=Bot{values::[Int],low::Int,high::Int}
实例显示(Bot)在哪里
显示b=显示(值b)++++++显示(低b)++++显示(高b)
getBot::Int->Map Int(Bot)->Bot
getBot我是
|(长度机器人==1)=机器人!!0
|否则=Bot[]false val false val
哪里
falseVal=-1
机器人=[b |(i2,b)Int->Map Int(Bot)->Map Int(Bot)
给定值botInd val oldM=newM
哪里
bot=getBot val oldM
newM=Map.insert botInd(Bot(val:values Bot)(low Bot)(high Bot))oldM
main=do
让机器人=机器人[17]3 4
让bots=Map.insert 0 bot(Map.empty)
打印$giveValue 0 61机器人程序
--从列表打印[(0[12]-1-1]

我想你的意思是
bot=getBot-botInd-oldM
不是
bot=getBot-val-oldM

编译器可能已经捕捉到了这一点,除非您使用
Int
作为要输入的值的类型以及查找bot的方式

如果您将整个
Bot
传递给
giveValue
,那么您可以确保您将正确的值传递给了正确的Bot

您还可以将“bot id”包装成一个新类型,比如
newtype BotId=BotId{unbtid::Int}
getBot
将接受一个
BotId
,然后ghc会抱怨您传递的是一个整数而不是一个id


也可以考虑使用<代码>可能是int >代码>而不是<代码>低和<代码>高< /代码>。事实上,您使用的是<代码> FalSEVAU/COD>是一个大的红旗,您应该使用<代码>或者< < /代码>。 >我认为您是“代码> BOT= GATBOT Boint OLDM < /C>不>代码> BOT= GETBOT VALOLD <代码> 编译器可能已经捕捉到了这一点,除非您使用
Int
作为要输入的值的类型以及查找bot的方式

如果您将整个
Bot
传递给
giveValue
,那么您可以确保您将正确的值传递给了正确的Bot

您还可以将“bot id”包装成一个新类型,比如
newtype BotId=BotId{unbtid::Int}
getBot
将接受一个
BotId
,然后ghc会抱怨您传递的是一个整数而不是一个id


也可以考虑使用<代码> INT/<代码>代替<代码>低和<代码>高< /代码>。您使用“<代码> FalSEVAU/CODE >的事实是一个巨大的红旗,您应该使用<代码>或者< <代码> >。谢谢,Libby!我将更新我的代码以使用更多的子类型,并且确保我不会。“别再搞砸了!很好,谢谢Libby!我将更新我的代码以使用更多的子类型,并确保我不会再搞砸了!次要风格的注释:

Bot(val:values Bot)(low Bot)(high Bot)
也可以使用“记录更新”编写
Bot{values=val:values Bot}
”语法。此外,签出和相关函数可修改映射。次要样式注释:
Bot(val:values-Bot)(low-Bot)(high-Bot)
也可以使用“记录更新”语法编写
Bot{values=val:values-Bot}
。此外,签出和相关函数可修改映射。