1

別のリスト内にタプルのリストがあり、平均を見つけるのに問題があります。

私は尋ねられた質問とインターネットをチェックしましたが、ほとんどの場合、すべてのタプルを一緒に追加してダイビングすることはカバーされていません。

私のリストタプルリストは[(String, Int)]、すべてのタプルの平均を見つけたいと思っています。

4

4 に答える 4

4

これは、。を使用して単純な整数のリストに簡単に変換できますmap snd。つまり、基本的に、sum $ map snd listOfTuplesそれらをすべて一緒に追加します。(平均を効率的に計算するには、もう少し洗練された方法を実行することをお勧めしますが、これで正しい方向に進むはずです。)

于 2012-04-16T22:07:07.490 に答える
1

また、フォームのリストが与えられた[(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)

于 2012-04-17T01:28:01.890 に答える
0

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のリストがある場合は、使用する必要がある可能性があることに注意してください

于 2012-04-17T01:01:16.700 に答える
0

ネットを検索すると、ここaverage :: (Real a, Fractional b) => [a] -> bなど多くの機能が見つかります。

したがって、タイプの関数が必要なだけで[(String, Int)] -> [Int]、2つを組み合わせることができます。

于 2012-04-16T22:06:04.147 に答える