haskell - 限制数据构造函数可以拥有的元素数量

标签 haskell

我正在用 Haskell 写一个 ADT,它代表一手牌。我的问题是我想限制(Suit,Face)的数量代表一张牌到 5 代表一手牌。

data Card = Hand [(Suit,Face)]

我试图做的是这个,但它不起作用。
data Card = Hand [(Suit,Face),(Suit,Face),(Suit,Face),(Suit,Face),(Suit,Face)]

我的问题是:我如何将元组的数量限制为 5?

最佳答案

我想补充一点,如果您使用基于 5 元组的解决方案(如其他答案中所建议的那样),您仍然可以拥有所需的所有折叠/遍历功能。特别是,首先定义

import Control.Applicative
import Data.Foldable
import Data.Traversable

data Tuple5 a = Tuple5 a a a a a

并定义 foldingtraversing对它的操作:
instance Traversable Tuple5 where
    traverse f (Tuple5 a b c d e)
            = Tuple5 <$> f a <*> f b <*> f c <*> f d <*> f e
instance Foldable Tuple5 where
    foldMap = foldMapDefault
instance Functor Tuple5 where
    fmap    = fmapDefault

然后,您可以拥有
data Hand = Hand (Tuple5 Card)

并使用 Foldable 中的任何方法折叠/遍历结构/Traversable/Functor .

更新:最近创建了一个小库tuples-homogenous-h98定义 newtype同质元组的别名,例如
newtype Tuple5 a = Tuple5 { untuple5 :: (a,a,a,a,a) }

并添加适当的 Traversable , Foldable , Functor , ApplicativeMonad实例。

关于haskell - 限制数据构造函数可以拥有的元素数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14547437/

相关文章:

haskell - LPath 的 Haskell 实现中是否存在空间泄漏?

使用随机数和 IO 的 Haskell 递归

Haskell 的类型关联链令人费解

haskell 如果为真则中断或继续循环

Haskell (a -> m a) -> m (a -> a) -> m (a -> a)

"mjoin"的 Haskell 标准函数(或简单组合)?

haskell - http-conduit 浏览器使用

haskell - 如何在列表推导中计算从属范围?

haskell - 通过 IO 了解 Haskell 中的纯函数

haskell - 解构 GADT : Where am I losing the context?