gpt4 book ai didi

haskell - Haskell 中应该避免 do 表示法吗?

转载 作者:行者123 更新时间:2023-12-03 07:28:41 26 4
gpt4 key购买 nike

大多数 Haskell 教程都会教授 IO 的 do-notation 的使用。

我也从 do 表示法开始,但这使我的代码看起来更像是命令式语言,而不是 FP 语言。

本周我看到了一个使用 IO 的教程 <$>

stringAnalyzer <$> readFile "testfile.txt"

而不是使用 do

main = do
strFile <- readFile "testfile.txt"
let analysisResult = stringAnalyzer strFile
return analysisResult

日志分析工具就完成了,没有do .

所以我的问题是“在任何情况下我们都应该避免使用 do 符号吗?”。

我知道也许do在某些情况下会使代码变得更好。

另外,为什么大多数教程都用 do 来教授 IO ?

我认为<$><*>使代码比 IO 更 FP。

最佳答案

do Haskell 中的表示法以一种非常简单的方式脱糖。

do
x <- foo
e1
e2
...

变成了

 foo >>= \x ->
do
e1
e2

do
x
e1
e2
...

进入

x >>
do
e1
e2
....

这意味着您确实可以使用 >>= 编写任何单子(monad)计算和return 。我们不这样做的唯一原因是因为它的语法更痛苦。 Monad 对于模仿命令式代码很有用,do符号使它看起来像这样。

C 风格的语法使初学者更容易理解它。你是对的,它看起来并不实用,但要求某人在使用 IO 之前正确理解 monad 是一个相当大的威慑。

我们使用 >>= 的原因和return另一方面是因为它对于 1 - 2 个衬垫来说更加紧凑。然而,对于太大的东西来说,它确实会变得更加难以阅读。因此,为了直接回答您的问题,不,请不要在适当的时候避免使用 do 符号。

最后你看到的两个运算符,<$><*> ,实际上分别是 fmap 和 applicative,而不是 monadic。它们实际上不能用来表示 do 表示法的很多功能。当然,它们更紧凑,但它们不允许您轻松命名中间值。就我个人而言,我大约 80% 的时间都在使用它们,主要是因为我倾向于编写非常小的可组合函数,而这些应用程序非常适合。

关于haskell - Haskell 中应该避免 do 表示法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16726659/

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