0

例如,我想创建一个允许灵活嵌套的列表类型,如下所示:

[[['a'],'a'],'a']

有可能在haskell中实现吗?我将如何编写它的类型签名?任何帮助都是极好的!!!

4

2 回答 2

2

您需要使用不同的值构造函数定义自己的数据类型。

来自ghci

Prelude> data Val a = Val a | List [Val a] deriving (Show)
Prelude> [List [List [Val 'a']], Val 'a']
[List [List [Val 'a']],Val 'a']

及其类型:

Prelude> :t [List [List [Val 'a']], Val 'a']
[List [List [Val 'a']], Val 'a'] :: [Val Char]

此外,查看 JSON 在 Real World Haskell 中的表示方式:http: //book.realworldhaskell.org/read/writing-a-library-working-with-json-data.html (搜索data JValue以查找相关数据类型)

于 2013-07-26T19:55:41.460 回答
2

这与其说是一个列表,不如说是一棵树。因此,您可以使用树数据类型来表示它。一个例子是中的玫瑰树containers,其定义大致为:

data Tree a = Node a [Tree a]

但在这种情况下,可能更合适的树类型是这样的(顺便说一下,它是 的自由单子[];玫瑰树是cofree 共单子):

data Tree a = Leaf a | Node [Tree a]

使用这种类型,您可以像这样表示您的“列表”,例如:

Node [Node [Node [Leaf 'a'], Leaf 'a'], Leaf 'a']
于 2013-07-26T19:57:20.010 回答