Graphics Programming

부분함수(partial function) 본문

Season 1/하스켈

부분함수(partial function)

minseoklee 2015. 12. 10. 18:50

하스켈로 채팅 봇을 작성하다 문제가 하나 발생했다.

 

wuss는 secure 웹소켓 클라이언트를 만들기 위한 라이브러리다. 웹소켓 클라이언트를 생성하는 함수는 runSecureClient다.

 

runSecureClient :: HostName  -> PortNumber -> String -> ClientApp a -> IO a

 

ClientApp은 별칭 타입이다.

 

type ClientApp a = Connection -> IO a

 

따라서 실제로는 다음과 같이 사용한다.

 

main = do

runSecureClient "some_host" 443 "some_path" app

 

app conn = do

-- input and output through websocket

 

app은 Connection만을 인자로 받는다. 그런데 만약 봇의 상태를 app에 인자로 넘겨주고 싶다면 어떻게 할까?

 

data BotState = BotState {

botName :: String,

botID :: String

} 

 

main = do

 

runSecureClient "some_host" 443 "some_path" app

 

app botState conn = do

putStrLn $ "bot name: " ++ (botName botState)

 

이제 타입이 맞지 않아 runSecureClient에 그냥 app을 인자로 줄 수는 없다. runSecureClientBotState도 인자로 받도록 하는 방법은 Wuss.hs 을 열어서 코드를 수정하고 모듈을 다시 컴파일하는 것 뿐이다. 물론 그다지 추천할 방법은 아니다.

 

그런데 부분함수를 이용하면 runSecureClient는 그대로 놔둬도 appBotState를 인자로 받는 것이 가능하다.

 

data BotState = BotState {

botName :: String,

botID :: String

} 

 

main = do

let botState = BotState "test_bot" "U8KTPD" 

 

runSecureClient "some_host" 443 "some_path" (app botState)

 

app botState conn = do

putStrLn $ "bot name: " ++ (botName botState)

 

app의 타입은 BotState -> Connection -> IO a다. 하지만 (app botState)의 타입은 Connection -> IO a다. 이제 타입이 맞기 때문에 문제 없이 컴파일할 수 있다.

 

Comments