该代码使用(->) a
类型,它被定义为here的Applicative
实例:
instance Applicative ((->) a) where
pure = const
(<*>) f g x = f x (g x)
可以解释此实现的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)
这难道不是一种挑战* *你,而不是我们呢? –
也可以写为'liftA2(/)和(fromIntegral。长度)'' – Khundragpan
纯˚F<*> X = F <$> x' – melpomene