最近、関数型プログラミングに関する知識を広げたかったので、Haskellを学び始めました。これまで、本当にそれを愛していると言わざるを得ません。現在使用しているリソースは、Pluralsightのコース「Haskell Fundamentals Part 1」です。残念ながら、私は次のコードに関する講師の特定の引用を理解するのにいくつかの困難があり、皆さんがトピックにいくつかの光を当てることができることを望んでいました。
付随するコード
helloWorld :: IO ()
helloWorld = putStrLn "Hello World"
main :: IO ()
main = do
helloWorld
helloWorld
helloWorld
見積もり
doブロックで同じIOアクションが複数回ある場合、それは複数回実行されます。したがって、このプログラムは文字列「Hello World」を3回出力します。この例は、それputStrLn
が副作用のある関数ではないことを示しています。変数putStrLn
を定義するために関数を1回呼び出しhelloWorld
ます。putStrLn
文字列を出力する副作用がある場合、文字列は1回だけ出力さhelloWorld
れ、メインのdoブロックで繰り返される変数は何の効果もありません。
他のほとんどのプログラミング言語では、putStrLn
関数が呼び出されたときに印刷が行われるため、このようなプログラムは「Hello World」を一度だけ印刷します。この微妙な違いは、初心者を誤解させることが多いため、これについて少し考えて、このプログラムが「Hello World」を3回印刷する理由と、putStrLn
関数が副作用として印刷を行った場合に1回だけ印刷される理由を理解していることを確認してください。
わからないこと
私にとっては、「Hello World」という文字列が3回表示されるのはほぼ自然なことです。私はhelloWorld
変数(または関数?)を、後で呼び出される一種のコールバックとして認識します。私が理解していないのは、putStrLn
副作用があった場合に文字列が1回だけ出力されるということです。または、なぜ他のプログラミング言語で一度だけ印刷されるのか。
C#コードで、次のようになっているとしましょう。
C# (フィドル)
using System;
public class Program
{
public static void HelloWorld()
{
Console.WriteLine("Hello World");
}
public static void Main()
{
HelloWorld();
HelloWorld();
HelloWorld();
}
}
私はかなり単純なものを見落としているか、彼の用語を誤って解釈していると確信しています。どんな助けでも大歓迎です。
編集:
ご回答ありがとうございます!あなたの回答は、これらの概念をよりよく理解するのに役立ちました。まだ完全にクリックされているとは思いませんが、今後このトピックを再検討します。ありがとうございました。
putStrLn
副作用はありません。それは単にIOアクションを返します。何回呼び出しても、引数に対する同じ IOアクションです。"Hello World"
putStrLn
helloworld
、印刷するアクションではないでしょうHello world
。それによって返される値であろうputStrLn
後 、それがプリントHello World
(すなわち、()
)。
helloWorld = Console.WriteLine("Hello World");
。あなただけ含まれているConsole.WriteLine("Hello World");
中でHelloWorld
機能実行されるたびにHelloWorld
呼び出されます。helloWorld = putStrLn "Hello World"
では、何が原因かを考えてみましょうhelloWorld
。を含むIOモナドに割り当てられます()
。バインドすると、>>=
それだけでそのアクティビティ(何かを出力する)が実行さ()
れ、バインド演算子の右側に表示されます。
helloWorld
C#のフィールドや変数などの定数であると考えてください。に適用されているパラメータはありませんhelloWorld
。