簡體   English   中英

無法使用Haskell數據結構中的列表

[英]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代替lowhighInt 您正在使用falseVal的事實是一個大的紅旗,您應該改為使用Maybe

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM