我想获得动态树的元素列表。
我有两种类型的节点:
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
不起作用。
有人知道如何解决它吗?
答案 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]