首页 > 解决方案 > 在 Haskell 中打印属性名称的有效方法

问题描述

您好,我是 Haskell 的新手,我想知道:

对于每个新定义的类型构造函数,即使它的深度为 0,例如:

data Letter =A | B | C deriving (Show)

我必须提供吗

instance Show Type
    Letter A = "A"
    Letter B ="B"
    Letter C ="C"

我知道对于嵌套类型,您必须提供Show实现,但对于一些简单的事情,是否没有其他方法可以只使用与反射(C#)等效的东西?只需获取属性名称/构造函数名称和 ToString-it

Showhaskell 程序员是否为他们创建的任何 adhoc 类型提供实例?

通过嵌套类型,我的意思是在另一个 ADT 内部有一个简单的 ADT 等等。但是你想要的只是得到他们的名字:

例如:

data Person = Male | Female
data IsMarried=Yes | No

data Worker=Worker{
            person::Person,
            status::IsMarried
            }

对于这种嵌套,我是否真的必须为所有这些类型的构造函数定义instanceof Show,即使我只想将它们的名称“字符串化”?

标签: haskelltypeclass

解决方案


我必须提供[每种类型的展示实例吗?]

不,因为你已经自动派生了Show

data Letter = A | B | C deriving (Show)
--                      ^^^^^^^^^^^^^^^ Here

但是,如果您想要一个“更智能” show,例如显示自定义列表[1,2,3]而不是一堆构造函数,您将不得不自己编写它。

您可以对许多类(包括EqOrdReadEnumBounded)执行相同的操作,但大多数类(包括用户定义的类)必须手动实现,而无需使用某些语言扩展。

我知道对于嵌套类型,您必须提供 Show implementation[...]

你不!例如,我可以这样写:

data Maybe a = Just a | Nothing deriving (Show)

并且编译器将自动添加必要的约束,尽管它是“嵌套”类型。

只需获取属性名称/构造函数名称和 ToString-it ?

Haskell 中没有“属性”——不要在这里用 C# 来思考。show相当于ToString但是,在TypeReps中提供了一种类型反射形式,但我建议在您牢牢掌握 Haskell 之前不要使用它。


推荐阅读