2017-07-25 10 views
1

私はコードワーでコーディングチャレンジをしています:与えられたリストの平均値を計算する書き込み関数avg。私のソリューションは機能しますが、私は他人のソリューションの1つをあまり理解していません。誰でも説明できますか?次のコードがどのように機能するかを説明することができますか?

avg :: [Float] -> Float 
avg = (/) <$> sum <*> fromIntegral . length 

が、それはすべきではない:あなたがすることで、この実装を解釈することができます

instance Applicative ((->) a) where 
    pure = const 
    (<*>) f g x = f x (g x) 

avg l = pure (/) <*> sum l <*> fromIntegral . length $ l 
+0

それは、私たちは、あなたのための* *の挑戦ではないではないですか? –

+1

また、 'liftA2(/)sum(fromIntegral。length)' – Khundragpan

+6

'pure f <*> x = f <$> x'と書くこともできます – melpomene

答えて

3

このコードでは、とhereに定義されて(->) aタイプのApplicativeインスタンスを使用していますnaryFunction <$> f1 <*> f2 <*> ... <*> fnを「すべてのn個の関数に同じパラメータを適用し、結果の引数をnaryFunctionに適用する」と考えてください。

あなたの場合、(/) <$> sum <*> fromIntegral . length\ xs -> (/) (sum xs) ((fromIntegral . length) xs)とちょうどsum xs/fromIntegral (length xs)と考えることができます。

あなたは、単に(<*>)の定義を使用して式を展開することによってこれを証明することができます

avg = (/) <$> sum <*> fromIntegral . length 
avg = fmap (/) sum <*> fromIntegral . length 
avg xs = (fmap (/) sum) xs ((fromIntegral . length) xs) 
avg xs = ((/) . sum xs) (fromIntegral (length xs)) -- fmap f g = f . g 
avg xs = sum xs/fromIntegral (length xs) 
関連する問題