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을 파싱, 공백문자는 무시.
pipe도 잘 쓰면 조와짐
내가 보냈다!