gpt4 book ai didi

haskell - 了解 Haskell 中的纯函数和副作用 - putStrLn

转载 作者:行者123 更新时间:2023-12-03 15:18:27 26 4
gpt4 key购买 nike

最近,我开始学习 Haskell,因为我想扩大我在函数式编程方面的知识,我必须说到目前为止我真的很喜欢它。我目前使用的资源是 Pluralsight 上的类(class)“Haskell Fundamentals Part 1”。不幸的是,我很难理解讲师关于以下代码的一个特定引用,并希望你们能对这个话题有所了解。

随行代码

helloWorld :: IO ()
helloWorld = putStrLn "Hello World"

main :: IO ()
main = do
helloWorld
helloWorld
helloWorld

报价

如果您在一个 do-block 中多次执行相同的 IO 操作,它将运行多次。所以这个程序打印出字符串'Hello World' 3 次。这个例子有助于说明 putStrLn不是有副作用的函数。我们调用 putStrLn函数一次定义 helloWorld多变的。如果 putStrLn有打印字符串的副作用,它只会打印一次, helloWorld在主 do-block 中重复的变量不会产生任何影响。

在大多数其他编程语言中,这样的程序只会打印一次“Hello World”,因为打印会在 putStrLn 时发生。函数被调用。这种细微的区别常常会让初学者绊倒,所以想一想,确保你理解为什么这个程序打印 'Hello World' 三次,以及为什么它只打印一次 putStrLn功能将打印作为副作用。

我不明白的

对我来说,字符串 'Hello World' 打印三遍似乎很自然。我认为 helloWorld变量(或函数?)作为一种稍后调用的回调。我不明白的是,如果 putStrLn有一个副作用,它会导致字符串只打印一次。或者为什么它只会在其他编程语言中打印一次。

假设在 C# 代码中,我假设它看起来像这样:

C# (Fiddle)
using System;

public class Program
{
public static void HelloWorld()
{
Console.WriteLine("Hello World");
}

public static void Main()
{
HelloWorld();
HelloWorld();
HelloWorld();
}
}

我确信我忽略了一些非常简单的东西或误解了他的术语。任何帮助将不胜感激。

编辑:

谢谢大家的答案!您的回答帮助我更好地理解了这些概念。我认为它还没有完全点击,但我以后会重新讨论这个话题,谢谢!

最佳答案

如果我们定义 helloWorld,可能会更容易理解作者的意思。作为局部变量:

main :: IO ()
main = do
let helloWorld = putStrLn "Hello World!"
helloWorld
helloWorld
helloWorld

您可以将其与类似 C# 的伪代码进行比较:
void Main() {
var helloWorld = {
WriteLine("Hello World!")
}
helloWorld;
helloWorld;
helloWorld;
}

IE。在 C# WriteLine是一个打印其参数并且不返回任何内容的过程。在 Haskell, putStrLn是一个函数,它接受一个字符串并为您提供一个操作,如果该字符串被执行,它将打印该字符串。这意味着写和写绝对没有区别
do
let hello = putStrLn "Hello World"
hello
hello


do
putStrLn "Hello World"
putStrLn "Hello World"

话虽这么说,在这个例子中差异并不是特别大,所以如果你不太明白作者在本节中试图理解的内容,那么现在继续前进也没关系。

如果将其与 python 进行比较,它会更好一些
hello_world = print('hello world')
hello_world
hello_world
hello_world

这里的重点是 Haskell 中的 IO 操作是“真实”值,不需要包装在进一步的“回调”或任何类似的东西中以防止它们执行 - 相反,让它们执行的唯一方法是将它们放在特定的位置(即 main 内的某个地方或从 main 产生的线程)。

这也不仅仅是一个小技巧,它最终会对你编写代码的方式产生一些有趣的影响(例如,这也是 Haskell 不需要任何你熟悉的常见控制结构的部分原因使用命令式语言,并且可以在函数方面做所有事情),但我也不会太担心这个(像这样的类比并不总是立即点击)

关于haskell - 了解 Haskell 中的纯函数和副作用 - putStrLn,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59035420/

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