在Haskell中列出的动态树

时间:2017-02-05 16:00:57

标签: haskell dynamic

我想获得动态树的元素列表。

我有两种类型的节点:

  • Indexnodes,可以存储两个数字和任意数量的子/子树(也不允许使用子树)
  • Datanodes,可存储数字。

An example how it can look like

data MultTree a = DataNode a | IndexNode a a [MultTree a] deriving Show

t1 :: MultTree Int
t1 =  IndexNode 3 42 [IndexNode 3 15 [DataNode 3, DataNode 11, DataNode 12], IndexNode 9 42 [DataNode 42, DataNode 23]]

dataList:: MultTree -> [DataNode] -> [Int]
dataList[] = []
dataList(x:xs) = x : dataList xs

列表必须包含所有数据节点。因此,对于dataList t1,列表应该看起来像[3, 11, 12, 42, 23]

我编码的函数dataList不起作用。

有人知道如何解决它吗?

1 个答案:

答案 0 :(得分:0)

最简单的方法是让你的(现代版GHC)编译器为你定义它。以下设置适当的语言扩展,并将所需的定义设置为默认的toList定义。我包含了作业,但通常只需拨打toList

{-# Language DeriveFoldable #-}
module MultTreeList  where

import Data.Foldable(toList)

data MultTree a = DataNode a | IndexNode a a [MultTree a] 
   deriving (Foldable,Show)

t1 :: MultTree Int
t1 =  IndexNode 3 42 [IndexNode 3 15 [DataNode 3, DataNode 11, DataNode 12], IndexNode 9 42 [DataNode 42, DataNode 23]]

dataList :: MultTree a -> [a]
dataList = toList

请注意类型签名。您的问题假设MultTree -> [DataNode] -> [Int]的签名。这在某些方面很糟糕。一个你忘了MultiTree的类型参数。第二个DataNode是一个类型构造函数,而不是一个类型。不允许在类型签名中包含构造函数。这有点像指定add函数,例如

add1 :: Int -> 1 -> Int

表示向Int添加一个的函数。我认为你打算使用我写的类型签名。

将模块装入GHCI。

*MultTreeList> dataList t1
[3,42,3,15,3,11,12,9,42,42,23]

如果不通过上述方法,您需要一种方法将两个构造函数映射到适当的列表构造。您有两种需要解决的模式,

dataList (DataNode a) = ?
dataList (IndexNode a b mts) = ??

我会帮助你开始。

dataList (DataNode a) = [a]
dataList (IndexNode a b mts) = a : b :  (??? mts)

请注意??? :: [MultTree a] -> [a]

的类型签名