繁体   English   中英

Haskell:访问自定义列表类型的元素

[英]Haskell: Accessing Elements of a Custom List Type

我是Haskell的新手,我在访问自定义类型的元素时遇到问题。

我有这些声明:

import Data.Char
import Data.List

data Objekt = Objekt Suit Value
  deriving(Eq,Show)
data Suit = Hearts | Spades | Diamonds | Clubs
  deriving(Eq,Show)
data Value = Seven | Eight | Nine | Ten | Jack | Queen | King | Ace
  deriving(Eq,Show)

data Deck = Deck [Objekt]
  deriving(Eq,Show)

现在,我正在创建一个像这样的套牌:

let deck = Deck [Objekt Hearts Seven, Objekt Clubs Queen]

然后我想检查甲板:

elem (Objekt Hearts Seven) deck

我收到一个错误:

*Main> elem (Objekt Hearts Seven) deck

<interactive>:8:28: error:
    • Couldn't match expected type ‘[Objekt]’ with actual type ‘Deck’
    • In the second argument of ‘elem’, namely ‘deck’
      In the expression: elem (Objekt Hearts Seven) deck
      In an equation for ‘it’: it = elem (Objekt Hearts Seven) deck

甲板显示以下内容:

*Main> deck
Deck [Objekt Hearts Seven,Objekt Clubs Queen]
*Main> :t Deck
Deck :: [Objekt] -> Deck

无论我做什么(我尝试使用地图或列表推导),我都无法访问套牌的元素。 我整天用Google搜索,但我似乎无法找到自定义列表类型及其访问的任何示例。

我正确地做了声明吗?

如何测试或提取我的卡座元素?

有人有想法吗? 任何帮助将不胜感激......谢谢

问题是卡列表在Deck构造函数中。 您应该使用模式匹配来提取列表。

你可以定义:

inDeck :: Objekt -> Deck -> Bool
inDeck card (Deck cards) = card  `elem` cards

然后,你可以问:

inDeck (Objekt Hearts Seven) deck

Deck是一种与列表类型不同的类型,但它只包含一个列表。

您可以使用值构造函数将列表转换为Deck

Deck :: [Objekt] -> Deck

这就是你在例如let deck = Deck [....]

您可以将Deck转换回具有小助手功能的列表,您可以将其添加到文件中:

unDeck :: Deck -> [Objekt]
unDeck (Deck os) = os

在此之后,您可以使用elem someObjekt (unDeck someDeck)

Nykros指出,另一种选择是使用模式匹配。 如果您正在学习Haskell,我建议您习惯模式匹配,因为它在Haskell中非常惯用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM