別のリスト内にタプルのリストがあり、平均を見つけるのに問題があります。
私は尋ねられた質問とインターネットをチェックしましたが、ほとんどの場合、すべてのタプルを一緒に追加してダイビングすることはカバーされていません。
私のリストタプルリストは[(String, Int)]
、すべてのタプルの平均を見つけたいと思っています。
別のリスト内にタプルのリストがあり、平均を見つけるのに問題があります。
私は尋ねられた質問とインターネットをチェックしましたが、ほとんどの場合、すべてのタプルを一緒に追加してダイビングすることはカバーされていません。
私のリストタプルリストは[(String, Int)]
、すべてのタプルの平均を見つけたいと思っています。
これは、。を使用して単純な整数のリストに簡単に変換できますmap snd
。つまり、基本的に、sum $ map snd listOfTuples
それらをすべて一緒に追加します。(平均を効率的に計算するには、もう少し洗練された方法を実行することをお勧めしますが、これで正しい方向に進むはずです。)
また、フォームのリストが与えられた[(String,Int)]
場合は、タイプを持つ unzip 関数を使用できます
[(a,b)] -> ([a],[b])
[(String,Int)] のようなリストの平均を取得するには、次のようにします。
(sum $ snd $ unzip myList) / length(myList)
fromIntegral 関数を使用して除算できるように、型を修正する必要があります。
したがって、次の関数を作成できます。
average :: [(a,Int)] -> Double
average xs = (fromIntegral $ sum $ snd $ unzip xs) / (fromIntegral $ length xs)
1回のパスで合計と長さを計算する方法は次のとおりです。
きれいではありませんが、機能します。
averageTuples ts = let results = calculateSum ts
in (fst results)/(snd results)
calculateSum ts = foldr acc (0,0) $ zip (map snd ts) (repeat 1) where
acc (x, y) (x', y') = (x+x', y+y')
main = print $ averageTuples [("foo", 1.09), ("bar", 2.6789), ("baz", 3.4)]
fromIntegral
すべてのIntのリストがある場合は、使用する必要がある可能性があることに注意してください
ネットを検索すると、ここaverage :: (Real a, Fractional b) => [a] -> b
など多くの機能が見つかります。
したがって、タイプの関数が必要なだけで[(String, Int)] -> [Int]
、2つを組み合わせることができます。