我的代碼拋出一個空列表錯誤。當我運行:Haskell Prelude.head錯誤,空列表
makeAgent :: Agent -> [Agent] -> Agent
makeAgent (Agent func n _) agents = (Agent func (n++(show $ length $ sameNames n agents)) empty) --appends number to name to differentiate agents
where sameNames n agents = filter (findName n) agents
findName n1 (Agent _ n2 _) = (slice 0 3 n1) == (slice 0 3 n2) --ignore the suffix
empty = head $ getEmpty (positions agents) (fst $ getGrid agents) --getGrid returns a tuple, but currently assume to be a square
baseline :: [Interaction] -> Float
baseline int = (fromIntegral total)/len
where total = sum sums
sums = map snd (showSums int)
agents = nub $ map (\(Interaction a1 a2 _) -> a2) int
len = fromIntegral $ length agents
reproduce :: Float -> [Interaction] -> [Agent] --so baseline isn't recalulated every time
reproduce _ [] = []
reproduce base interaction = winners ++ [newAgent] ++ reproduce base (tail interaction)
where agents = nub $ concat $ map (\(Interaction a1 a2 _) -> a1:a2:[]) interaction
winners = [a | a <- agents, (sumAgent interaction a) >= (round base)]
newAgent = makeAgent (head winners) winners
main = do
output "Length" (fromIntegral $ length int)
output "Baseline" base
output "Agents" agents
output "Sums" (showSums int)
output "winners" winners
output "NeAgent" (makeAgent (head winners)winners)
output "New Agents" (reproduce base int)
where agents = generate 4
int = playRound agents 20
base = baseline int
winners = [a | a <- agents, (sumAgent int a) >= (round base)]
這是什麼重現,主要功能,應該做的根據自己的父母「全民健身」是否超過一定水平時產生一個新的代理,然後用所有,但有運行相同的功能代理列表中的代理。
它輸出:
Length: 16
Baseline: 280.0
Agents: [c_pavlov(-1,-1),c_titForTat(-1,0),c_sucker(-1,1),b_grim(0,-1)]
Sums: [("c_pavlov",280),("c_titForTat",280),("c_sucker",280),("b_grim",280)]
winners: [c_pavlov(-1,-1),c_titForTat(-1,0),c_sucker(-1,1),b_grim(0,-1)]
NeAgent: c_pavlov1(0,0)
prisoners: Prelude.head: empty list
當我打電話重現,它拋出prelude.head空列表錯誤,獲獎者,代理人,和int列表是所有非空的,所以它可能是一個邊緣在遞歸的最後一次迭代中出現大小寫錯誤。這是爲什麼發生?
您不會向我們展示打印「囚犯」的行 – Ingo 2013-03-08 09:45:57
不是文件的名稱,所以這就是它在錯誤發生之前的前綴。 – MichaelFine 2013-03-08 21:37:48
請提供完整的信息來源。 – 2013-03-10 16:58:18