繁体   English   中英

要在Haskell中列出的动态树

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM