2

我目前正在编写自己的结构,它可以同时处理整数和字符串:

就像是

data Collection = One Int | Two String | Three(Collection)(Collection)

但是,我正在尝试编写一个可以将我的结构转换为列表的函数。

我是否认为这是不可能的,因为默认情况下会:

[1,2,"测试"]

在控制台中不起作用,因此我的功能必然会失败?

4

3 回答 3

6

您可能应该只定义

type Collection = [Either Int String]

然后,而不是做

l = [1,2,"test"]

你可以做

l :: Collection
l = [Left 1, Left 2, Right "test"]

如果您需要两种以上的类型,则需要定义自己的成员类型。所以你也会做这样的事情

data MemberType = MyInt Int | MyString String | MyFloat Float deriving Show
type Collection = [MemberType]
l :: Collection
l = [MyInt 1, MyInt 2, MyString "test", MyFloat 2.2]

deriving Show不是必需的,但能够简单地print l以一种很好的方式打印列表是很好的。

于 2012-09-18T22:14:40.167 回答
4

您的数据结构基本上是一棵二叉树,它在每个叶子上存储一个Int或一个。String遍历这棵树自然会是一个[Either Int String].

于 2012-09-18T22:05:46.707 回答
2

Haskell 中的列表只能有一种类型。如果您想要一个列表来处理多种类型,您需要创建一个新的包装器类型,它可以代表您想要放入其中的两种类型,以及提取原始类型并处理它的函数。例如,您可以使用Either.

于 2012-09-18T22:03:37.970 回答