如何在Haskell中编写一个函数,它返回5张牌的所有组合,而不是从给定的牌组中获取

时间:2016-10-14 15:47:03

标签: haskell

我对编程不是很有经验,而且我遇到了一个我似乎无法弄清楚的问题。 我有类型:

public class Contract {
[Key]
public int Id { get; set; }
public string AwardId { get; set; }

public virtual ICollection<ContractHistory> contractHistory { get; set; }
}

public class ContractHistory {
[Key]
public int Id { get; set; }
public string AwardId { get; set; }

public int ContractId { get; set;}

[ForeignKey("ContractId")]
public virtual Contract contract { get; set; }
}

我想编写一个函数newtype Hand = Hand { unHand :: [Card] } deriving (Eq, Show) type Deck = [Card] ,以便返回可以从给定套牌中获取的5张牌的所有可能组合。

allHands

其中allHands :: Deck -> [Hand] allHands deck = combs 5 deck 是我所做的函数,它返回通过从列表中取n个元素可以形成的所有可能组合。

我的功能不起作用,因为我的函数combs :: Int -> [a] -> [[a]]的结果是(combs 5 deck ),我希望它是[[Card]]。任何人都可以帮我这个吗?

2 个答案:

答案 0 :(得分:2)

你几乎拥有它。

allHands deck = map Hand (combs 5 deck)

这是我的原始答案,可能没有做你想要的(因为它会产生重复):

import Data.List (permutations)

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

答案 1 :(得分:0)

使用Data.List子序列

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