首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"SubTypes“有自己的显示,并可在其他模块中使用

"SubTypes“有自己的显示,并可在其他模块中使用
EN

Stack Overflow用户
提问于 2017-01-21 22:26:44
回答 1查看 57关注 0票数 1

我很确定我的问题源于这样一个事实:我对Haskell并不熟悉,也不完全理解类型系统。

我将在类型主题上使用Haskell的wiki中使用的示例

定义了以下类型

代码语言:javascript
复制
 data Suit = Club | Diamond | Heart | Spade

现在的第一个问题是,我想为每个“子类型”(俱乐部,钻石,心脏,黑桃)实现Show,但这似乎不起作用,因为它是一个DataKinds。所以我把它分成了自己的类型。(这些属性没有多大意义,但我添加它们是为了更接近真正的代码)

代码语言:javascript
复制
data ClubType = ClubType {
  clubName :: String,
  icon :: String
} 
instance Show ClubType where
  show (ClubType cn i) = "name: " ++ cn ++ ", icon: " ++ i

在西装类型中使用它们

代码语言:javascript
复制
data Suit = Club ClubType 
          | Diamond DiamondType 
          | Heart HeartType 
          | Spade SpadeType

现在我想使用西装和“亚型”(俱乐部,钻石,心脏,黑桃)在一个不同的module。我只输出了Suit (..)

使用

代码语言:javascript
复制
import Module1 (Suit(..))

getSuit :: String -> Suit
getSuit "Club" = getClub
getSuit "Heart" = getHeart
...

getClub :: () -> Club

现在又一次不能使用ClubHeartDiamondSpade,因为它们是DataKinds。我该如何使用“子类型”?我需要出口所有类型的产品吗?如果我这样做,它是否符合getSuit的返回类型?

(如果这个例子没有很多意义的话,我很抱歉,但我希望你能遵循我想要的结果)

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-21 22:37:29

是的,听起来你好像不太懂类型系统。我会尽我最大的努力澄清我认为你哪里出错了。在你的例子中

代码语言:javascript
复制
data Suit = Club | Diamond | Heart | Spade

只有一种类型,即SuitClubDiamond等根本不是类型,如果您将它们称为“子类型”,您会感到困惑。它们的正确名称是构造函数,它们本质上是Suit类型的值。

代码语言:javascript
复制
Club :: Suit
Diamond :: Suit
...

因此,您不能真正为“每个实例”实现一个Show实例,您只能通过构造函数上的模式匹配为整个类型的Suit实现一个Show实例:

代码语言:javascript
复制
instance Show Suit where
    show Club = "Clubs"
    show Diamond = "Diamonds"
    show Heart = "Heart"
    show Spade = "Spade"

这在类型show上定义了一个函数Suit -> String,同样没有“子类型”发生任何事情。我想知道这是不是你想要的。

由于您提到了datakind,在类型级别上使用构造函数仍然不能使它们成为类型--它们仍然是Suit类型的值。在类型级别使用它们的一个示例是按以下方法索引GADT:

代码语言:javascript
复制
data Card :: Suit -> * where
    QueenOfSpades :: Card Spade
    OtherCard :: Int -> Card s   -- we'd want to encode the suit s at the data
                                 -- level too using a singleton, out of scope
                                 -- for this post

但这是相当先进的东西,可能不是你要找的东西。

我希望这能澄清一点。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41785205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档