【问题标题】:Dynamic Tree to List in Haskell在 Haskell 中列出的动态树
【发布时间】:2017-06-22 14:09:33
【问题描述】:

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

我有两种类型的节点:

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

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不起作用。

有人知道我该如何解决吗?

【问题讨论】:

  • dataList 的类型签名没有意义。你应该从那里开始。 (另外,你的实现实际上是id :: [a] -> [a],它什么都不做。)
  • 尝试先定义一个更简单的版本。你需要写什么才能让dataList (DataNode 42) 返回[42]

标签: haskell dynamic


【解决方案1】:

最简单的方法是让您的(现代版 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 的类型参数。 Second 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]的类型签名

【讨论】:

    猜你喜欢
    • 2015-12-09
    • 1970-01-01
    • 1970-01-01
    • 2014-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多