![]() |
1
12
1.改用模式匹配您可以解决这个问题,而不必动态检查数据类型。事实上,在Haskell中很少需要它。通常可以使用模式匹配。 例如,如果您有一个类型
例子:
2.要动态检查类型,请使用Data.Typeable
稀有的
如果您真的需要动态地检查类型,您可以使用
Data.Typeable
类型类及其应用
很可能,您需要使用 DeriveDataTypeable |
![]() |
2
6
(抱歉,我走得有点远/太深了。CliffsNotes的版本是“不,你不能真正做你想做的事情,因为类型不是值,我们不能给你的函数一个合理的类型;使用您自己的数据类型。第一段和第五段(不包括这一段或代码块)解释了我所说的第一部分的核心意思,答案的其余部分应该提供一些澄清/细节。)
粗略地说,不,这是不可能的,有两个原因。第一个是类型分派问题。这个
为什么会这样?Haskell有两种多态性,我们现在关注的是
parametric polymorphism
. 这就是当你有这样的类型时你所看到的
您正在尝试为不同类型的数据调用不同的函数,即席定义。令人震惊的是, ad-hoc polymorphism . 例如,在C++中,可以定义以下函数:
这将允许你为不同的类型做不同的事情。你甚至可以
这个问题与您试图输入的列表有关。Haskell的列表类型定义为(大致)
因此,要获得所有必要的属性,您需要一个不同的类型。您想要的类型有一个不同的属性:它要么不包含任何内容,要么是一个元素后跟值的其余部分,要么是元素的嵌套列表后跟值的其余部分。换句话说,就像
然后,代替列表
别用这个! 说真的。另一种技术几乎肯定是更好的选择。但是,这种技术很酷,所以我将在这里介绍它。考虑以下代码:
我们正在创建一个
类型类
我们可以把他们的例子平复。如果我们有
但是,由于有多个实例等原因,它确实需要一个单一类型的注释:例如,您需要编写,
再说一次,我很抱歉,我累了就开始唠叨。不过,我还是希望这会有所帮助! |
![]() |
3
5
您混淆了交互式命令
|
![]() |
4
3
如您所见,问题需要您为任意嵌套的列表创建自己的数据结构。 普通haskell列表不能任意嵌套。列表中的每个元素都必须具有相同的类型(静态已知),这就是为什么动态检查元素的类型没有意义的原因。 一般来说,haskell不允许您创建不同类型的列表,然后在运行时检查该类型。您可以使用typeclasses为具有不同类型参数的flatten定义不同的行为,但这仍然不能提供任意嵌套的列表。 |
![]() |
Vasiliy Ivashin · 从类实例导入泛型隐式 7 年前 |
![]() |
user1747134 · 导出线性包装时的一个类型检查错误 7 年前 |
![]() |
Loic · 从超类型解析隐式参数 8 年前 |
![]() |
lsund · 无法将类类型与haskell中的特定类型匹配 8 年前 |
![]() |
muhuk · 如何匹配没有特定类型类实例的类型?[副本] 8 年前 |
![]() |
Emre Sevinç · 如何解释类型检查的Haskell代码? 8 年前 |