최근에는 함수형 프로그래밍에 대한 지식을 넓히고 싶었 기 때문에 Haskell을 배우기 시작했으며 지금까지는 정말 사랑한다고 말해야합니다. 현재 사용중인 리소스는 Pluralsight의 'Haskell Fundamentals Part 1'코스입니다. 불행히도 다음 코드에 대한 강사의 특정 인용문을 이해하는 데 약간의 어려움이 있으며 여러분 이이 주제에 대해 밝힐 수 있기를 바랍니다.
동반 코드
helloWorld :: IO ()
helloWorld = putStrLn "Hello World"
main :: IO ()
main = do
helloWorld
helloWorld
helloWorld
인용구
do-block에 동일한 IO 작업이 여러 번있는 경우 여러 번 실행됩니다. 따라서이 프로그램은 문자열 'Hello World'를 세 번 인쇄합니다. 이 예제 putStrLn는 부작용이있는 기능이 아니라는 것을 보여줍니다 . 변수 putStrLn를 정의하기 위해 함수를 한 번 호출합니다 helloWorld. 경우 putStrLn문자열을 인쇄하는 부작용이 있었다, 한 번만 인쇄 할 것이다 및 helloWorld주요 DO-블록에 반복 변수는 영향을주지 것입니다.
대부분의 다른 프로그래밍 언어에서 이와 같은 프로그램은 putStrLn함수가 호출 될 때 인쇄가 발생하므로 'Hello World'를 한 번만 인쇄 합니다. 이 미묘한 차이로 인해 초보자가 종종 트립되므로이 부분에 대해 조금 생각해보고이 프로그램이 왜 'Hello World'를 세 번 인쇄하는지 그리고 putStrLn함수가 인쇄 작업을 부작용으로 한 경우 한 번만 인쇄하는 이유를 이해해야 합니다.
내가 이해하지 못하는 것
나를 위해 문자열 'Hello World'가 세 번 인쇄되는 것이 거의 당연합니다. helloWorld변수 (또는 함수?)를 나중에 호출되는 일종의 콜백으로 인식합니다 . 내가 이해하지 못하는 putStrLn것은 부작용이 있다면 문자열이 한 번만 인쇄되는 방법입니다. 또는 다른 프로그래밍 언어로 한 번만 인쇄되는 이유는 무엇입니까?
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 모나드에 할당됩니다 (). 바인딩하면 바인딩 >>=작업 만 수행하고 (인쇄) (), 바인드 연산자의 오른쪽에 표시됩니다.
helloWorldC #에서 필드 또는 변수와 같이 일정하다고 생각하십시오 . 에 적용되는 매개 변수가 없습니다helloWorld.