Haskell Arrow



haskell arrow에서 가장 유사한 개념을 Javascript 에서 찾는다면 Promise가 되겠다. Promise에서 넘겨받은걸 .then(f)로 연쇄하여 오류를 크게 줄이면서 가독성 좋은 코딩이 가능해진다. Haskell 에는 훨씬 종류가 많은 arrow가 있는데 그 설명은 턱도없이 부족하여 코딩 초보는 이해하기가 상당히 어렵다.

참고한 문서는
https://wikidocs.net/1928
https://wikidocs.net/1931
2개이며 처음에는 어느쪽을 봐도 처음에는 이해가 되지 않을것이다.
다만 요점은 자바스크립트의 .then(f) 라든지 async await 처럼 함수를 둘러싸는 방식으로 진행하여
action을 순차전달 하는것으로 코드를 단순화한다. 함수는 매개변수가 빠지거나 타입이 안맞으면 오류를 발생시키는게 그에 따르는 문제를 해결하기 위한 시도가 있어왔고 그건 함수형 프로그래밍을 공부하면서 직접 확인하기 바란다.

action은 함수와 상태값을 같이 넘겨주는 것으로 많은 .js 프레임워크나 라이브러리에서 기본적인 이벤트 전달방식이므로 무조건 알고 있어야 한다.

arrow는 모나드의 일반적인 형태로 함수를 둘러싸서 조작할수 있게 해준다.

-- Arrow 문법을 사용하여 함수를 정의할 수 있습니다.
func1 :: a -> b
func2 :: b -> c
func3 :: c -> d

-- Arrow composition을 사용하여 함수를 조합할 수 있습니다.
result :: a -> d
result = (func3 <<< func2 <<< func1)

mean1 :: Fractional a => Circuit a a
mean1 = (total &&& (const 1 ^>> total)) >>> arr (uncurry (/))

평균을 정의하는 arrow 연쇄. 참고문서를 직접 읽어보기 바란다. 아래와 같다.

mean2 :: Fractional a => Circuit a a
mean2 = proc value -> do
    t <- total -< value
    n <- total -< 1
    returnA -< t / n

haskell에서는 입출력도 함수의 연쇄로 해결한다.

word = do char 'w' >> char 'o' >> char 'r' >> char 'd'
          return "word"

main =
 do name <- getLine
    let loudName = makeLoud name
    putStrLn ("Hello " ++ loudName ++ "!")
    putStrLn ("Oh boy! Am I excited to meet you, " ++ loudName)

Comment

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다