[英]Dynamic Tree to List in Haskell
我想获得我的动态树元素的列表。
我有两种类型的节点:
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 t1
[3, 11, 12, 42, 23]
。
我编码的dataList
函数不起作用。
有人知道我该如何解决吗?
最简单的方法是让您(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]
的类型签名 ??? :: [MultTree a] -> [a]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.