-- 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 -- 하스켈 근본 문법(하스켈 로고임)