Haskell での等価性のチェックを高速化 (または私の関数の場合は削除) することは可能ですか? エージェントのすべての相互作用を合計する関数があります。相互作用は 2 つのエージェント間で行われます。相互作用を合計するには、最初にエージェントが相互作用の最初または 2 番目のエージェントと等しいかどうかを確認してから、それを合計する必要があります。等しいかどうかのチェックは、プログラムの実行時間のほぼ半分を占めています。
sumAgent :: [Interaction] -> Agent -> Int
sumAgent xs agent = foldr (\x acc -> acc + sumInteraction agent x) 0 xs
-- Use this in a map call of sumAgent to return the sums of a specific agent
sumInteraction :: Agent -> Interaction -> Int
sumInteraction agent (Interaction a1 a2 xs )
| (==) agent a1 = sum $ map fst scores
| (==) agent a2 = sum $ map snd scores
| otherwise = 0
where scores = map score xs
ac 関数を使用するか、エージェントの一部のみの等価性をチェックすることにより、等価性チェックを削除したり、高速化したりすることは可能ですか? Eq の実装は次のとおりです。
data Agent = Agent {
function::[(Bool,Bool)] -> Bool,
name::String,
position::(Int,Int),
dna::DNA
}
instance Eq Agent where
(==) a1 a2 = position a1 == position a2