ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Haskell] #0 Hello, Haskell!
    곡뢀/ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 2020. 1. 9. 21:28

    μ•ˆλ…•ν•˜μ„Έμš”, 레λͺ¬ν‚΄μž…λ‹ˆλ‹€πŸ‹

     

    맀일 같이 λ§Œλ§Œν•œ 글감을 μ°Ύμ•„ 헀맀고 μžˆμ—ˆλŠ”λ° 마침.. μ œκ°€ Haskell μŠ€ν„°λ””λ₯Ό μ‹œμž‘ν•˜κ²Œ λ˜μ—ˆλ„€μš”? γ…Ž

    잘 λλ„€μš”! (λΆ€λ‹΄μŠ€λŸ½μ§€ μ•Šμ€) 글감이 생겼어! 

     

    ν˜Ήμ‹œλΌλ„ ν‹€λ¦° λΆ€λΆ„μ΄λ‚˜ 질문 μ œλ³΄ν•΄μ£Όμ‹œλ©΄ 맀우 κ°μ‚¬ν•˜κ² μŠ΅λ‹ˆλ‹€ :) 

     

    κ΅μž¬λ‘œλŠ” κ°€μž₯ μ‰¬μš΄ ν•˜μŠ€μΌˆ μ±… (μ˜μ–΄ 원문은 무료둜 κ³΅κ°œλ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€ http://learnyouahaskell.com/chapters. 원문이 더 μ‰½λ‹€λŠ” 평이 많긴 ν•©λ‹ˆλ‹€.)

    μ»΄νŒŒμΌλŸ¬λŠ” 온라인 IDE https://repl.it/languages/haskell μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

     

    μ±…μ—μ„œλŠ” GHCiλ₯Ό 직접 μ„€μΉ˜ν•΄ μ‚¬μš©ν•˜λŠ”λ°, μ €λŠ” μ„€μΉ˜μ— μ‹€νŒ¨ν•΄μ„œ.. μ„±κ³΅ν•˜λ©΄ 또 μ˜¬λ €λ“œλ¦΄κ²Œμš”...πŸ˜‚

    λͺ‡ 번의 μ‚½μ§ˆ 끝에 μ„±κ³΅ν–ˆμŠ΅λ‹ˆλ‹€ :) ν˜Ήμ‹œ κΆκΈˆν•˜μ‹  뢄은 μ°Έκ³ ν•΄μ£Όμ„Έμš” 

    2020/01/11 - [개발 μ‚½μ§ˆκΈ°/κ·Έ μ™Έ] - [Haskell] MAC OS에 GHC (Haskell 컴파일러)μ„€μΉ˜ν•˜κΈ°

     

    κ·Έλ‚˜μ €λ‚˜, Haskell이 λ­˜κΉŒμš”?

    μ œκ°€ μ°Έκ³ ν•˜κ³  μžˆλŠ” κ΅μž¬μ—μ„œμ˜ μ •μ˜λŠ” λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

     

    1. ν•˜μŠ€μΌˆμ€ 순수 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 언어이닀. (Purely Functional)

    ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ μ–΄λ–€ μž‘μ—…μ„ ν•˜λΌκ³  μ»΄ν“¨ν„°μ—κ²Œ μ•Œλ €μ£ΌλŠ” 것이 μ•„λ‹ˆλΌ κ·Έ μž‘μ—…μ΄ 무엇인지λ₯Ό μ•Œλ €μ€€λ‹€. μ΄λŸ¬ν•œ μž‘μ—…μ„ ν•¨μˆ˜λΌκ³  ν•œλ‹€.

    그리고 ν•œ 번 ν•¨μˆ˜ 내에 λ³€μˆ˜λ₯Ό μ„€μ •ν–ˆμœΌλ©΄ κ·Έ 값을 λ°”κΏ€ 수 μ—†λ‹€. 이 것을 λΆ€μž‘μš©(side effect)κ°€ μ—†λ‹€κ³  ν•œλ‹€.

    λ”°λΌμ„œ, μ–΄λ–€ ν•¨μˆ˜λ₯Ό 같은 맀개 λ³€μˆ˜λ‘œ 두 번 ν˜ΈμΆœν•˜λ©΄ 항상 κ·Έ κ²°κ³ΌλŠ” κ°™λ‹€. μ΄λ₯Ό μ°Έμ‘° 투λͺ…성이라고 ν•œλ‹€.

     

    2. ν•˜μŠ€μΌˆμ€ Lazyν•˜λ‹€.

    ν•„μš”ν•œ μ‹œμ κΉŒμ§€ μž‘μ—…μ„ 미룬닀. λ§Œμ•½ λ°°μ—΄μ˜ 100λ²ˆμ§ΈκΉŒμ§€ 합을 κ³„μ‚°ν•˜λΌκ³  ν•˜κ³  κ·Έ 값을 좜λ ₯ν•˜κ±°λ‚˜ μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄, ν•˜μŠ€μΌˆμ€ κ·Έ 값을 κ³„μ‚°ν•˜μ§€ μ•ŠλŠ”λ‹€.

     

    3. ν•˜μŠ€μΌˆμ€ Statically Typed 이닀.

    ν•˜μŠ€μΌˆμ„ μ‚¬μš©ν•  λ•ŒλŠ” λͺ¨λ“  λ³€μˆ˜μ˜ νƒ€μž…μ„ 일일히 지정해주지 μ•Šμ•„λ„ λœλ‹€. ν•˜μŠ€μΌˆμ€ λŸ°νƒ€μž„μ΄ μ•„λ‹Œ 컴파일 μ‹œμ μ—μ„œ λͺ¨λ“  λ³€μˆ˜μ˜ νƒ€μž…μ„ 슀슀둜 μ•Œμ•„λ‚Έλ‹€. 

     

    4. ν•˜μŠ€μΌˆμ€ μš°μ•„ν•˜κ³  κ°„κ²°ν•˜λ‹€.

    ν•˜μŠ€μΌˆμ€ μ½”λ“œκ°€ 짧닀. μ΄λŠ” 버그λ₯Ό 쀄여주고 μœ μ§€λ³΄μˆ˜λ₯Ό μ‰½κ²Œ ν•œλ‹€.

     

    ...라고 ν•˜λ„€μš”. μ•„μ§κΉŒμ§€λŠ” μ‹€μ œ μ½”λ“œλ₯Ό 보지 λͺ»ν•΄μ„œ 이해가 잘 μ•ˆλ˜λ„€μš”. κ·Έλ ‡λ‹€λ©΄ μ½˜μ†”μ„ 켜고 기본적인 μžλ£Œν˜•λ“€μ„ μ‚΄νŽ΄λ³ΌκΉŒμš”?

     

    μ΄λ²ˆμ— μ‚΄νŽ΄λ³Ό λ‚΄μš©λ“€

    1. 숫자

    2. λ¬Έμžμ—΄ 

    3. Bool

    4. ν•¨μˆ˜

    5. if문

    6. μ½˜μ†”μ„ μ‚¬μš©ν•œλ‹€λ©΄ μ‚¬μš©ν•  κ°„λ‹¨ν•œ 좜λ ₯ ν•¨μˆ˜ putStrLn

     

     

    μ±…μ—μ„œλŠ” μ„œλ¬Έ + 1μž₯의 리슀트 μ „ κΉŒμ§€μ˜ λ‚΄μš©μž…λ‹ˆλ‹€.

     

    그럼 μ–΄λ”” ν•œ 번 온라인 에디터λ₯Ό μΌœμ„œ ν—€λ”©(...)ν•΄λ³ΌκΉŒμš”?

    https://repl.it/languages/haskell

     

    1. 숫자

    μ •μˆ˜ν˜•, λΆ€λ™μ†Œμˆ˜μ μ„ μ§€μ›ν•©λ‹ˆλ‹€.

    사칙 연산은 λ‹€λ₯Έ 것과 λ˜‘κ°™λ„€μš”

    2. λ¬Έμžμ—΄

    " "둜 감싸면 λ©λ‹ˆλ‹€. "μ•ˆλ…•" 처럼.

    hi = "hello"

    Haskellμ—μ„œ λ¬Έμžμ—΄μ€ Char의 List이기 λ•Œλ¬Έμ—, ++ μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. 

    μ•„λž˜μ˜ a + bλŠ” '+' κ°€ 숫자만 λ°›λŠ” νƒ€μž…μ΄λΌμ„œ λ™μž‘ν•˜μ§€ μ•Šκ³  였λ₯˜κ°€ λ‚˜λ„€μš”.. λ‚˜μ€‘μ— λ¬Έμžμ—΄ 연산에 λ“€μ–΄κ°€λ©΄ μ•Œ 수 있겠죠, 뭐!

     

    3. Bool

    False, True 둜 값을 ν‘œν˜„ν•˜κ³ , ||으둜 or, && κ°€ and, not(λ³€μˆ˜)으둜 뢀정을 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

    ν”νžˆ λ³΄μ΄λŠ” !(λ³€μˆ˜)λŠ” λ™μž‘ν•˜μ§€ μ•Šλ„€μš”.

    false = False
    true = True

    False && True //False
    False || True // True
    not (False) // True !(True)λŠ” λ™μž‘ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ! μ—°μ‚°μžλŠ” μ—†λ‚˜λ΄μš”. ν˜Ήμ‹œ μ•„μ‹œλŠ” λΆ„ μžˆμœΌμ‹œλ©΄ μ•Œλ €μ£Όμ„Έμš”!

     

    4. ν•¨μˆ˜

    Haskell은 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ° 언어이죠. κ·Έ λ•Œλ¬Έμ— ν•¨μˆ˜λ„ λ³€μˆ˜μ²˜λŸΌ μ„ μ–Έν•˜κ³  μ‚¬μš©λ„ ν•  수 μžˆλ‹΅λ‹ˆλ‹€.

    사싀 μš°λ¦¬λŠ” μ € μœ„μ˜ 예제λ₯Ό ν•˜λ©΄μ„œλ„ 계속 ν•¨μˆ˜λ₯Ό μ“°κ³  μžˆμ—ˆμ–΄μš”!

     

    ν˜Ήμ‹œ 무엇인지 λˆˆμΉ˜μ±„μ…¨λ‚˜μš”? λ§žμ•„μš”. +, -, /... 등등이 λͺ¨λ‘ λ‹€ ν•¨μˆ˜ μž…λ‹ˆλ‹€.

    a + b 처럼 맀개 λ³€μˆ˜μ˜ 쀑간에 μ˜¨λ‹€κ³  ν•΄μ„œ μ€‘μœ„ ν•¨μˆ˜λΌκ³  ν•΄μš”

     

    일반적인 저희가 μ•„λŠ” ν˜•νƒœμ˜ ν•¨μˆ˜λ“€μ€ 이름이 μ•žμ— 였고, 뒀에 맀개 λ³€μˆ˜λ“€μ΄ 였죠. κ·Έκ±Έ μ „μœ„ ν•¨μˆ˜λΌκ³  λΆ€λ¦…λ‹ˆλ‹€.

    http://learnyouahaskell.com/starting-out#ready-set-go  의 예제λ₯Ό 데렀와 λ΄€μŠ΅λ‹ˆλ‹€. 

    ν›„μœ„ ν•¨μˆ˜λ„ λ˜λ‚˜ μ‹œλ„ν•΄λ΄€λŠ”λ°... 였λ₯˜κ°€ λ‚˜λ„€μš”. 이건 μ‘°κΈˆλ” 곡뢀해 보면 λ‚˜μ˜€μ§€ μ•Šμ„κΉŒ μ‹Άλ„€μš”!

     

    ν•¨μˆ˜ μ •μ˜ (Declaration)

    //1개의 맀개 λ³€μˆ˜λ₯Ό λ°›λŠ” ν•¨μˆ˜
    doubleme x = x + x

    //2개의 맀개 λ³€μˆ˜λ₯Ό λ°›λŠ” ν•¨μˆ˜
    addme a b = a + b

    //ν•¨μˆ˜ μ•ˆμ—μ„œ 또 ν•¨μˆ˜ λΆ€λ₯΄κΈ°
    doubleus a b = doubleme a + doubleme b

    //ν•¨μˆ˜λͺ…은 λŒ€λ¬Έμžκ°€ λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€!
    Doubleme x = x + x //였λ₯˜!


    hello' a = a + 2
    // '(Apostrophe)도 μ‚¬μš©ν•  수 μžˆμ–΄μš”. ν•¨μˆ˜λͺ…에 이것이 λΆ™λŠ” κ²½μš°λŠ” μ±…μ—μ„œλŠ” Haskell의 일반적인 ν•¨μˆ˜μ²˜λŸΌ Lazy ν•˜μ§€ μ•Šκ³ , μ¦‰κ°μ μœΌλ‘œ μˆ˜ν–‰μ„ ν•˜λŠ” (strict)ν•¨μˆ˜λ‚˜, 이름이 λΉ„μŠ·ν•œ ν•¨μˆ˜λ‚˜ λ³€μˆ˜μ—κ²Œ 뢙인닀고 ν•©λ‹ˆλ‹€.

     

    ν•¨μˆ˜ 호좜

    doubleme x = x + x //μ •μ˜

    doubleme 3 // 호좜. 결과 6


    //2개의 맀개 λ³€μˆ˜λ₯Ό λ°›λŠ” ν•¨μˆ˜

    addme a b = a + b

    addme 3 4  // 7


    //호좜, ν•¨μˆ˜ μ •μ˜ μ‹œ μ •μ˜ μˆœμ„œλŠ” μ „ν˜€ 상관 μ—†μŠ΅λ‹ˆλ‹€!

    doubleme (doubleus 4 3)

     

    ν•¨μˆ˜ 쀑첩 μ‚¬μš©

    doubleme x + x  //μ •μ˜

    doubleme (doubleme 3)  //μ‚¬μš©. κ²°κ³Ό 12

     

    + ν•¨μˆ˜λŠ” μš°μ„ μˆœμœ„κ°€ κ°€μž₯ λ†’λ‹€.

    ν•¨μˆ˜λŠ” μš°μ„  μˆœμœ„κ°€ κ°€μž₯ λ†’μŠ΅λ‹ˆλ‹€. μ•„λž˜ 예λ₯Ό 보죠!


    //ν•¨μˆ˜κ°€ κ°€μž₯ 높은 μš°μ„ μˆœμœ„λ₯Ό κ°–λŠ”λ‹€...!
     
    succ 2 * 3 //은 7이 μ•„λ‹ˆλΌ 9
    //succ2 κ°€ λ¨Όμ € μ‹€ν–‰λ˜μ–΄ 3이 되고, κ·Έ 이후 3 *  3이 λ˜μ–΄ 9κ°€ λœλ‹€.

    (succ 2) * 3 //즉 이와 κ°™μŒ

    //μš°μ„  μˆœμœ„λ₯Ό λ°”κΎΈλ €λ©΄ μ•„λž˜μ²˜λŸΌ κ΄„ν˜Έλ₯Ό μ”Œμš°μž.

    succ (2*3)

    5. if λ¬Έ 

    Haskellμ—μ„œ, if문을 μ‚¬μš©ν•  λ•Œ, elseλŠ” ν•„μˆ˜ μž…λ‹ˆλ‹€. λΉ„μ›Œλ‘μ–΄μ„œλŠ” μ•ˆλ˜μ–΄μš”!

    isBiggerThan100 a = if a > 100 then True else False // 1μ€„λ‘œ μ„ μ–Έ ν•˜κΈ°

    doubleSmallNumber x = if x > 100
    then x
    else x* 2


    doubleSmallNumber x = (if x > 100 
    then x 
    else x* 2) + 1


    //κ΄„ν˜Έλ„ μ‚¬μš©ν•΄μ„œ 묢을 수 μžˆμŠ΅λ‹ˆλ‹€

    6. Interactive Compilerκ°€ 아닐 경우 μ‚¬μš©ν•  κ°„λ‹¨ν•œ 좜λ ₯ ν•¨μˆ˜ putStrLn

    μ €λŠ” μ„€μΉ˜μ— 계속 μ‹€νŒ¨ν•˜κ³  μžˆμ–΄μ„œ 온라인 Interactive Compilerλ₯Ό μΌμ§€λ§Œ, λˆ„κ΅°κ°€λŠ” μ„±κ³΅ν•˜μ…”μ„œ 컴파일 ν•˜μ‹€ 것 같기에... 

    μ½”λ“œλŠ” μ œκ°€ μ“°κ³  있던 온라인 IDE의 예제 μ½”λ“œμ™€ ν•΄μ»€λž­ν¬μ˜ 첫 번쨰 ν•˜μŠ€μΌˆ 문제λ₯Ό  μ°Έμ‘°ν–ˆμŠ΅λ‹ˆλ‹€!

    main = do 
      putStrLn "좜λ ₯" //νƒ­μœΌλ‘œ λ“€μ—¬μ“°κΈ° ν•΄μ£Όμ„Έμš”! 각 ν•¨μˆ˜μ™€ ꡬ문을 κ΅¬λ³„ν•˜λŠ” λ“― ν•©λ‹ˆλ‹€
      name <- getLine //μž…λ ₯을 λ°›μŠ΅λ‹ˆλ‹€. μ—”ν„°λ‘œ μž…λ ₯을 끝낼 수 μžˆμŠ΅λ‹ˆλ‹€
      putStrLn ( "Hey, " ++ name)

     

    마무리 & 심화 ν•™μŠ΅(?)

    μ“°λ‹€λ³΄λ‹ˆκΉŒ 저도 λͺ¨λ₯΄κ²Œ λ³€μˆ˜ νƒ€μž…μ„ 적지 μ•ŠλŠ” 거에 μ΅μˆ™ν•΄μ§€λ„€μš”γ…‹γ…‹ ν™•μ‹€νžˆ νƒ€μž… κ΄€λ ¨ μ‹œμŠ€ν…œμ΄ κ°•λ ₯ν•˜λ‹€λŠ” 건 잘 μ•Œκ² μŠ΅λ‹ˆλ‹€. ν•¨μˆ˜ν˜•μ΄λΌμ„œ κ°μ²΄λΌλŠ” κ°œλ…μ€ μ—†λŠ” 것 κ°™μœΌλ‹ˆ.. 자꾸 저도 λͺ¨λ₯΄κ²Œ 객체 선언은 μ–΄λ–»κ²Œ ν•˜μ§€? ν•˜λ©° μ°Ύκ³  μžˆλ‹€κ°€ μ•„ 이거 ν•¨μˆ˜ν˜•μ΄μ§€ λ§žλ‹€ ν•˜κ³  λ‹€μ‹œ λ˜λŒμ•„κ°€κ²Œ λ˜λ„€μš”. ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ€ 정말 μƒμ†Œν•˜κΈ΄ ν•˜λ„€μš”. μ“°λ‹€ 보면 μ΅μˆ™ν•΄μ§€κ² μ£ ?

     

     

    μ‹¬ν™”ν•™μŠ΅?

     

    ν•΄μ»€λž­ν¬μ—μ„œλ„ Haskell둜 ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ ν•™μŠ΅ν•  수 μžˆλŠ” μ½”μŠ€λ₯Ό μ—΄μ–΄λ‘μ—ˆλ„€μš”. μ˜μ–΄κ°€ λ˜μ‹ λ‹€λ©΄ 해보아도 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€ :)

    https://www.hackerrank.com/challenges/fp-solve-me-first/problem

     

    λŒ“κΈ€

Designed by Tistory. @Bola Kim