1

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
4

1 に答える 1