例如,我想创建一个允许灵活嵌套的列表类型,如下所示:
[[['a'],'a'],'a']
有可能在haskell中实现吗?我将如何编写它的类型签名?任何帮助都是极好的!!!
例如,我想创建一个允许灵活嵌套的列表类型,如下所示:
[[['a'],'a'],'a']
有可能在haskell中实现吗?我将如何编写它的类型签名?任何帮助都是极好的!!!
您需要使用不同的值构造函数定义自己的数据类型。
来自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
以查找相关数据类型)
这与其说是一个列表,不如说是一棵树。因此,您可以使用树数据类型来表示它。一个例子是中的玫瑰树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']