haskell - 在 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?
Show
haskell 程序员是否为他们创建的任何 adhoc 类型提供实例?
通过嵌套类型,我的意思是在另一个 ADT 内部有一个简单的 ADT 等等。但是你想要的只是得到他们的名字:
例如:
data Person = Male | Female
data IsMarried=Yes | No
data Worker=Worker{
person::Person,
status::IsMarried
}
对于这种嵌套,我是否真的必须为所有这些类型的构造函数定义instance
of Show
,即使我只想将它们的名称“字符串化”?
解决方案
我必须提供[每种类型的展示实例吗?]
不,因为你已经自动派生了Show
:
data Letter = A | B | C deriving (Show)
-- ^^^^^^^^^^^^^^^ Here
但是,如果您想要一个“更智能” show
,例如显示自定义列表[1,2,3]
而不是一堆构造函数,您将不得不自己编写它。
您可以对许多类(包括Eq
、Ord
、Read
、Enum
和Bounded
)执行相同的操作,但大多数类(包括用户定义的类)必须手动实现,而无需使用某些语言扩展。
我知道对于嵌套类型,您必须提供 Show implementation[...]
你不!例如,我可以这样写:
data Maybe a = Just a | Nothing deriving (Show)
并且编译器将自动添加必要的约束,尽管它是“嵌套”类型。
只需获取属性名称/构造函数名称和 ToString-it ?
Haskell 中没有“属性”——不要在这里用 C# 来思考。show
相当于ToString
。但是,在TypeReps中提供了一种类型反射形式,但我建议在您牢牢掌握 Haskell 之前不要使用它。
推荐阅读
- apache-spark - Spark SQL 中使用的嵌套 java bean
- deployment - 在 JBOSS EAP 7.1 中,如何将 EJB 和 undertow 的统计启用设置为 True?
- c# - 如何在 web.config 中使用 url 重写重定向?
- haskell - 不是逆变/逆变/可分/可判定的好例子?
- visual-studio - 修复退出代码 -2147024891 JetBrains ResharperTestRunner 无法启动
- ruby-on-rails - 将对象导出到当前内联显示数据的 csv 文件
- xslt-2.0 - 无法在 XSLT 中使用 group by 对元素值进行分组
- c# - 如何更新用户的管理器?
- html - 时刻未设置为时间类型
- python - Python:将变量发送到另一个脚本而不运行