2016-10-14 1 views
0

프로그래밍에 익숙하지 않아서 생각할 수없는 문제가 있습니다. 아웃. 내가 유형이 있습니다하스켈에서 주어진 카드 갑판에서 가져올 수있는 것보다 5 카드 손의 모든 조합을 반환하는 함수를 작성하는 방법

newtype Hand = Hand { unHand :: [Card] } deriving (Eq, Show) 
type Deck = [Card] 

내가 그것을 주어진 갑판에서 취할 수 5 개 카드의 가능한 모든 조합을 반환 allHands하도록 함수를 작성하고자합니다. combs :: Int -> [a] -> [[a]]

allHands :: Deck -> [Hand] 
allHands deck = combs 5 deck 

는리스트에서 n 개의 요소를 고려하여 형성 될 수있는 모든 가능한 조합을 리턴 I 만든 함수이다.

내 함수 (combs 5 deck)의 결과가 [[Card]]이고 내 값이 [Hand]이되기를 원하기 때문에 내 기능이 작동하지 않습니다. 아무도 이것으로 나를 도울 수 있습니까?

+1

을 시퀀스 :

allHands deck = map Hand (combs 5 deck) 

여기에 아마 (이 중복 생성하기 때문에) 당신이 원하는 것을하지 않는 내 원래의 대답 작업? 어떤 오류가보고 있습니까? "이 코드가 작동하지 않는 이유"를 묻는 질문에는 특정 문제 또는 오류에 대한 설명이 필요합니다. 'deck :: [Card]'그리고'map'ping'Hand :: [Card] -> Hand's over'comb5 deck :: [[Card]]'타입이''[Hand]'타입이어야합니다. 작동해야하므로 문제의 현재 설명에서 어떤 문제가 발생하는지 알 수 없습니다. – Cirdec

답변

2

거의 가지고 있습니다. 그것을하지 않는 방법 Data.List를 사용

import Data.List (permutations) 

allHands = map Hand . map (take 5) . permutations 
+0

갑판에 5 장 이상의 카드가 있으면 어떻게됩니까? 손이 뚜렷합니까? – Cirdec

+0

@ Cirdec 좋은 지적. 이 접근법과 중복 될 것이지만 요구 사항은 고유해야한다고 말하지는 않습니다;) – user2297560

0

allHands = filter ((5==).length) . subsequences 
+0

이것은 'combs'을 구현하는 한 가지 방법입니다. 이 방법으로 중형 데크의 모든 작은 손을 계산하는 데 매우 오랜 시간이 걸릴 수 있습니다. – Cirdec

관련 문제