Dieser Code verwendet die Applicative
Instanz des (->) a
Typ, der here wie folgt definiert ist:
instance Applicative ((->) a) where
pure = const
(<*>) f g x = f x (g x)
können Sie diese Implementierung interpretieren, indem sie denke an naryFunction <$> f1 <*> f2 <*> ... <*> fn
als "den gleichen Parameter auf alle n Funktionen anwenden und die resultierenden Argumente auf naryFunction
anwenden".
In Ihrem Fall kann (/) <$> sum <*> fromIntegral . length
als \ xs -> (/) (sum xs) ((fromIntegral . length) xs)
gedacht werden, die nur sum xs/fromIntegral (length xs)
ist.
Sie können dies unter Beweis stellen, indem Sie einfach Ihren Ausdruck mit der Definition von (<*>)
erweitert:
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)
Ist es nicht ein * Herausforderung * für Sie, nicht wir? –
Sie können es auch schreiben als 'liftA2 (/) sum (fromIntegral. Length)' – Khundragpan
'rein f <*> x = f <$> x' – melpomene