阅读http://learnyouahaskell.com/functors-applicative-functors-and-monoids#applicative-functors后,我可以提供一个将函数用作应用函子的示例:
假设res
是一个有 4 个参数的函数,fa
, fb
, fc
,fd
都是接受单个参数的函数。然后,如果我没记错的话,这个适用的表达式:
f <$> fa <*> fb <*> fc <*> fd $ x
意思与这个非花哨的表达相同:
f (fa x) (fb x) (fc x) (fd x)
啊。我花了相当多的时间来理解为什么会这样,但是——在一张纸和我的笔记的帮助下——我应该能够证明这一点。
然后我阅读了http://learnyouahaskell.com/for-a-few-monads-more#reader。我们又回到了这个问题上,这次是单子语法:
do
a <- fa
b <- fb
c <- fc
d <- fd
return (f a b c d)
虽然我需要另一张 A4 纸来证明这一点,但我现在非常有信心,这再次意味着相同:
f (fa x) (fb x) (fc x) (fd x)
我很困惑。为什么?这有什么用?
或者,更准确地说:在我看来,这似乎只是将函数的功能复制为应用程序,但语法更冗长。
那么,你能给我举个例子,说明 Reader monad 能做到 applicatives 不能做到的吗?
实际上,我还想问这两个中的任何一个有什么用:应用函数或 Reader monad - 因为虽然能够将相同的参数应用于四个函数(fa
, fb
, fc
, fd
)而不用重复这个参数四次确实减少了一些重复性,我不确定这一微小的改进是否能证明这种复杂程度;所以我想我一定错过了一些突出的东西;但这值得一个单独的问题