[英]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.