gpt4 book ai didi

haskell - Reader monad 可以做哪些应用函数不能做的事情?

转载 作者:行者123 更新时间:2023-12-02 12:03:38 25 4
gpt4 key购买 nike

已阅读 http://learnyouahaskell.com/functors-applicative-functors-and-monoids#applicative-functors ,我可以提供一个使用函数作为应用仿函数的示例:

假设 res 是一个有 4 个参数的函数,以及 fafbfc 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 可以实现应用程序无法实现的功能吗?

实际上,我还想问这两个函数有什么用:应用函数或 Reader monad - 因为同时能够将相同的参数应用于四个函数(fa, fb, fc, fd) 而不重复此参数四次确实减少了一些重复性,我不确定这一分钟的改进是否合理这种复杂程度;所以我想我一定错过了一些突出的东西;但这值得一个单独的问题

最佳答案

一元版本允许您在对上下文中找到的函数的调用之间添加额外的逻辑,甚至决定根本不调用它们。

do
a <- fa
if a == 3
then return (f a 1 1 1)
else do
b <- fb
c <- fc
d <- fd
return (f a b c d)

在你原来的do中表达式,确实您没有做任何 Applicative 的事情实例无法做到这一点,事实上,编译器可以确定这一点。如果您使用ApplicativeDo扩展名,然后

do
a <- fa
b <- fb
c <- fc
d <- fd
return (f a b c d)

确实会脱糖为 f <$> fa <*> fb <*> fc <*> fd而不是fa >>= \a -> fb >>= \b -> fc >>= \c -> fd >>= \d -> return (f a b c d) .

<小时/>

这也适用于其他类型,例如

  • Maybe :

    f <$> (Just 3) <*> (Just 5)
    == Just (f 3 5)
    == do
    x <- Just 3
    y <- Just 5
    return (f 3 5)
  • [] :

    f <$> [1,2] <*> [3,4]
    == [f 1 3, f 1 4, f 2 3, f 2 4]
    == do
    x <- [1,2]
    y <- [3,4]
    return (f x y)

关于haskell - Reader monad 可以做哪些应用函数不能做的事情?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55797418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com