1. 합성 연산자 (.)와 적용 연산자 ($)를 활용하여 괄호를 최소화 할 수 있다.

a = f (g (h x))

b = f $ g $ h x

c = f $ g $ h $ x

d = f . g $ h x

e = f . g . h $ x

개인적으로 (e)를 선호한다.


2. fmap(<$>)를 둘다 적절히 사용하면 괄호를 최소화 할 수 있다

get = return $ Just (1,2) :: IO (Maybe (1,2))

x <- fmap (fmap fst) get -- Just 1

y <- fmap fst <$> get -- Just 1


3. (<$>)와 (<*>)연산자를 사용해서 liftMn 함수를 대체할 수 있다. 모나딕(Applicative)한 값들을 여러개 합할때 유용하다.

data Person = Person {name :: String, age :: Int}

getName :: Monad m => m String

getAge :: Monad m => m Int

person1 <- liftM2 Person getName getAge

person2 <- Person <$> getName <*> getAge


4. record 는 다음처럼 정렬하는게 국룰이다.

data BiiigRecord = {x :: A, y :: B, z :: C, w :: D}

record = BiiigRecord { x = getX

                     , y = getY

                     , z = getZ

                     , w = getW

                     }

혹은

record =

  BiiigRecord

  { x = getX

  , y = getY

  , z = getZ

  , w = getW

  }


5. (<>)등의 연산자도 잘 활용하면 DSL냄새를 풍길 수 있다.

data Put = ..

instance Monoid Put


class Serializable a where

  put :: a -> Put


instance Serializable Person where

  put (Person name age)

    = put "Person"

   <> put " { name = " <> put name

   <> put " , age = "  <> put age

   <> put " }"


6. 하스켈에서 Applicative관련 연산자는 무조건 left to right 합성이다. 다음과 같은 경우에 유용하다.

(*>) :: Applicative f => f a -> f b -> f b

(<*) :: Applicative f => f a -> f b -> f a

-- flip (*>)는 (<*)가 아니다.

ws :: Parse () -- 임의 길이의 공백문자(white space)를 파싱.

string :: Parse String -- String을 파싱

string' = ws *> string <* ws :: Parse String -- 공백문자로 둘러싸인 String을 파싱, 공백문자는 무시.


24