gpt4 book ai didi

haskell - 如何使用 Control.Applicative 编写更干净的 Haskell?

转载 作者:行者123 更新时间:2023-12-03 03:42:33 24 4
gpt4 key购买 nike

在最近的answer to a style question中,我写的

main = untilM (isCorrect 42) (read `liftM` getLine)

isCorrect num guess =
case compare num guess of
EQ -> putStrLn "You Win!" >> return True
...

Martijn有用的建议替代方案:

main = untilM (isCorrect 42) (read <$> getLine)

EQ -> True <$ putStrLn "You Win!"

使用 Control.Applicative 中的抽象可以使 Haskell 代码中的哪些常见模式变得更清晰?为了有效地使用 Control.Applicative,需要牢记哪些有用的经验法则?

最佳答案

回答你的问题有很多话要说,但是,既然你问了,我将提供这个“经验法则”。

如果您使用do -符号和您生成的值[1]未在您正在排序的表达式中使用[2],那么该代码可以转换为应用风格。同样,如果您在排序的表达式中使用一个或多个生成的值,则必须使用 MonadApplicative不够强大,无法实现相同的代码。

例如,让我们看一下下面的代码:

do a <- e1
b <- e2
c <- e3
return (f a b c)

我们在<-右侧的表达式中都没有看到这一点。是否出现任何生成的值( abc )。因此,我们可以将其改造为使用Applicative代码。这是一种可能的转变:

f <$> e1 <*> e2 <*> e3

还有另一个:

liftA3 f e1 e2 e3

另一方面,以这段代码为例:

do a <- e1
b <- e2 a
c <- e3
return (f b c)

此代码不能使用Applicative [3]因为生成的值a稍后在理解式中的表达式中使用。这必须使用Monad得到结果——尝试将其分解为 Applicative来了解一下原因。

关于这个主题还有一些更有趣和有用的细节,但是,我只是想给您这个经验法则,您可以浏览 do - 理解并快速确定是否可以将其纳入Applicative样式代码。

[1] <- 左侧出现的内容.

[2] <- 右侧出现的表达式.

[3] 严格来说,部分内容可以通过分解 e2 a 来实现。 .

关于haskell - 如何使用 Control.Applicative 编写更干净的 Haskell?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2104446/

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