monad-lab / study

2 stars 1 forks source link

[CH08] 실습 코드 공유 #67

Open PingPingE opened 8 months ago

PingPingE commented 8 months ago
-- do 아래부터 indentation 시작해야함 / tab말고 space로

import Data.Char
main2 = do -- 시작과 끝을 바인딩
    name <- getLine

    -- do 에서는 in 생략 (다만 let만 하고 끝내선 안되고 아래 구문 완결을 위한 코드가 있어야함) 
    let big_name = map toUpper name
        big_name2 = map toUpper name

    -- let 구문 완결을 위한 코드
    -- $: apply 연산자 / 우선순위를 뒤로 미룸 (없으면 big_name 먼저 프린트 해버림 -> ++ 먼저 연산하도록함)
    putStrLn $ big_name ++ big_name2
    -- 괄호로 대체 가능
    putStrLn (big_name ++ big_name2)
    -- print foo

main :: IO () 
-- main 타입은 마지막 줄의 타입 기반으로 정해짐
main = do
    return ()
    return "haha"
    putStrLn "hh" -- 이게 마지막 줄이면 IO ()
    return "fdaga" -- 이게 마지막 줄이면 Monad m => m String

-- do 에 IO 없어도 돌아간다
foo :: Num b => [b]
foo = do
    x <- [1,2,3]
    y <- [10,20,30]
    return $ x+y -- return의 의미: 다른 언어처럼 종료가 아님 ... 다시 functor의 세계로 돌려보낸다
    [x+y]     

-- do  + <- + putStrLn  구문 말고 다른 문법으로 간결하게 getLine하고 프린트 하는 법 : >>=
foo2 = getLine >>= putStrLn --  하스켈 근본 문법(하스켈 로고임)