列表中的下一个元素
Next element in a list
我在Haskell中有一个功能returns我是一张卡片的继承者。我知道如何使用列表理解来访问卡片,但不太确定如何获取下一张卡片,所以 pos+1。这是我的代码:
pCard :: Card->Deck->Card
pCard (K,C) _ = (A,S) --exception for last card
pCard crd pck = head [p | (pos,p) <- (zip [0..51] pck), crd==p]
提示:使用dropWhile (/= crd) pck
从头开始移除所有的牌,直到找到你的牌。那么,剩下的第一张牌是crd
。下一个就是你想要的
不过,如果 pck
是一副 标准顺序的牌组 ,遍历整个牌组以找到下一张牌似乎效率很低。
你可以让你的Card
类型实例化Enum
typeclass by deriving Enum
, then use the succ
函数来获得后继卡。
请注意,将牌组的最后一张牌传递给 succ
会导致运行时错误,尽管看起来您的第一个 pCard
函数体会解决这个问题。
我刚刚注意到您的 Card
类型似乎是一个元组;我猜您使用 type
关键字定义了 Card
?在这种情况下,如果不使用 GHC 扩展,我上面提出的解决方案将无法工作。
我在Haskell中有一个功能returns我是一张卡片的继承者。我知道如何使用列表理解来访问卡片,但不太确定如何获取下一张卡片,所以 pos+1。这是我的代码:
pCard :: Card->Deck->Card
pCard (K,C) _ = (A,S) --exception for last card
pCard crd pck = head [p | (pos,p) <- (zip [0..51] pck), crd==p]
提示:使用dropWhile (/= crd) pck
从头开始移除所有的牌,直到找到你的牌。那么,剩下的第一张牌是crd
。下一个就是你想要的
不过,如果 pck
是一副 标准顺序的牌组 ,遍历整个牌组以找到下一张牌似乎效率很低。
你可以让你的Card
类型实例化Enum
typeclass by deriving Enum
, then use the succ
函数来获得后继卡。
请注意,将牌组的最后一张牌传递给 succ
会导致运行时错误,尽管看起来您的第一个 pCard
函数体会解决这个问题。
我刚刚注意到您的 Card
类型似乎是一个元组;我猜您使用 type
关键字定义了 Card
?在这种情况下,如果不使用 GHC 扩展,我上面提出的解决方案将无法工作。