2013년 2월 11일 월요일

const & id

const id

const x y = x
const id x y = y
const id <=> flip const
      by H-99: 99 Haskell Problems Solutions

생각

const id x = id이므로,
const id x y
 <=> id y
 <=> y

다른 방법

id :: a -> a 이고
const :: b -> c -> b 이므로,
const id :: (a -> a) -> c -> (a -> a)
그러므로, id를 pass through하고 나면,
c -> (a -> a). 즉,  c -> a -> a
결론적으로, 두번째 요소가 반환된다. (맞나?)


[ from 山本和彦 ]

정의
id :: a -> a
id x = x

const :: a -> b -> a
const x _ = x

id의 사용
  • 함수를 fold할 때의 초기값.
map (+1) . filter odd . take 10
<=> foldr (.) id [map (+1), filter odd, take 10]
  • Bool을 그대로 되돌려주는 술어.
takeWhile (==True) [True,True,True,False,True]
<=> takeWhile id [True,True,True,False,True]
const의 사용
  • 인수를 무시하는 함수.
ignore :: SomeException -> IO ()
ignore = const (return ())
-- ignore _ = return ()

함수합성의 .(dot) 와 $

함수합성은 맨 우측만 $로 하고 나머지를 .(dot)로 하면 대체로 잘 된다.

foldl or foldr 선택방법

[ from Hideyuki Tanaka (@tanakh) on Twitter ]

foldr
  • 이항연산이 좌변인수에 대한 cost가 클때.
  • 무한리스트를 다룰 때.
foldl'
  • 이항연산이 인수에 대해서 정격일때.
foldl
  • 그 외에.

[ 원문 ]
foldlとfoldrの選択:二項演算が対象律を満たさないとき→選択子がそもそもない、満たすとき→二項演算の左辺引数に対するコストが大きい or 無限リストを扱いたい→foldr、二項演算が引数に対して正格 -> foldl' それ以外→foldl

재귀와 foldr

[ from RWH ]

Haskell에서는 반복 명령에 대신에 재귀를 사용한다.
구조화를 고려한다면 반복보다 재귀가 낫다.
여기에 value를 포함한 구조화가 foldr 이라고 생각하면 된다.