은 가정하자 나는 다음과 같은 하스켈 코드를 한 : 위의 코드에서하스켈 타입
data Option
= Help
| Opt1 Int Double String
-- more options would be here in a real case
handleOption :: Option -> IO()
handleOption option = case option of
Help -> handleHelp
Opt1 n f s -> handleOpt1 n f s
handleHelp :: IO()
handleHelp = print "help"
handleOpt1 :: Int -> Double -> String -> IO()
handleOpt1 n f s = print (n, f, s)
, 내가를 유지할 수 있다는 점에서 사전의 목적을 해체 나에게 낭비를 보인다 데이터 묶음. 이제 Opt1의 각 부분을 개별적으로 전달하거나 함께 전달하기 위해 하나의 개별 데이터 형식을 만들어야합니다. handleOpt1 Help
을 컴파일 오류로 만드는 등 Option
인스턴스를 전달할 수 없도록하는 동안 전체 Opt1
을 handleOpt1
으로 전달할 수 있습니까? 아래
예 의사 코드 :
data Option
= Help
| Opt1 Int Double String
handleOption :: Option -> IO()
handleOption option = case option of
Help -> handleHelp
opt1 @ Opt1{} -> handleOpt1 opt1
handleHelp :: IO()
handleHelp = print "help"
handleOpt1 :: Option:Opt1 -> IO()
handleOpt1 (Opt1 n f s) = print (n, f, s)
handleOpt1 (Opt1Params N F의 S) = .... 'handleOpt1'에 전달 된 값이 오른쪽 생성자로 생성되었는지를 검사 할 수 없습니다 (일반적으로 소스 코드에서 명시 적으로 전달 된 값을 확인할 수 있지만 일반적으로 전달 된 값은 런타임 중에 계산되므로 아무도 예외적 인 경우를 검사하기위한 코드를 작성했습니다). –
당신은 옵션에 대한 typeclass를 만들 수 있습니다. 실존 적 수량화를 사용하여 그들을 결합하고 (그 조합으로부터 유용한 정보를 추출하는) 몇 가지 방법을 찾아 낼 수 있습니다 ... 아니면 사소한 것들에 대해 걱정할 필요가 없습니다. 프로그램에 성능을 저하시키는 무언가가 있다면, 아마도 그렇지 않을 것입니다. – Cubic
"낭비"란 말은 성능 수준이 아니라 디자인 수준을 의미했습니다. 내 게시물을 업데이트했습니다. –