Haskell二叉树解析
我正在学习如何在Haskell中构建和解析二叉树,我发现了一个程序示例,我不太了解它的工作原理。。因此,代码是:Haskell二叉树解析,haskell,tree,binary,Haskell,Tree,Binary,我正在学习如何在Haskell中构建和解析二叉树,我发现了一个程序示例,我不太了解它的工作原理。。因此,代码是: module Main where data TTT aa = Leaf [aa] | Node (TTT aa) (TTT aa) deriving (Show,Eq); a :: Num a => Integer -> Integer; a x = x^2; ff_a :: TTT Integer -> TTT Integer; ff_a t =
module Main where
data TTT aa = Leaf [aa] | Node (TTT aa) (TTT aa) deriving (Show,Eq);
a :: Num a => Integer -> Integer;
a x = x^2;
ff_a :: TTT Integer -> TTT Integer;
ff_a t = mm a t;
mm :: (Integer -> Integer) -> TTT Integer -> TTT Integer;
mm f (Node a1 a2) = Node(mm f a1) (mm f a2);
mm f (Leaf n) = Leaf(new_mm f n);
new_mm :: (Integer -> Integer) -> [Integer] -> [Integer];
new_mm f (a:a1) = f a : new_mm f a1;
new_mm f [] = [];
tree =
Node
(Node
(Node
((Leaf[16,-5,19]))
((Leaf[14,24,-55,27]))
)
(Node
((Leaf[37,11,64]))
((Leaf[-14,6,29]))
)
)
(Node
(Node
((Leaf[10,-19,22]))
((Leaf[3,4,5,-7]))
)
(Node
((Leaf[31,29,13]))
((Leaf[18,38,-4]))
)
)
main :: IO ();
t0 = tree
t1 = ff_a tree
main = do
print t0;
print t1;
有人能给我解释一下
mm
和new\u-mm
是如何工作的吗?Integer->Integer
和TTT Integer->TTT Integer
是什么意思?这是什么数据类型?OP中显示的代码没有编译,但很容易修复。将a
更改为:
a :: Integer -> Integer;
a x = x^2;
(顺便说一句,分号是多余的,应该删除。用分号结束每一行不是习惯用法。)
有人能给我解释一下“mm”和“new_-mm”的功能到底是如何工作的吗
mm
取决于new\u-mm
,所以让我们从这里开始。了解Haskell代码的工作方式和作用的一种常见方法是在GHCi中进行实验
*Main> new_mm a []
[]
*Main> new_mm a [1,2,3]
[1,4,9]
*Main> new_mm (\i -> i + 1) [1,2,3]
[2,3,4]
new_mm
函数根据函数参数转换输入列表中的每个值。它只是一个内置的map
函数,从零开始实现,仅限于Integer
上使用。如果您需要了解map
实现是如何工作的,我确信您的Haskell学习资源中包含了一个解释
mm
函数只是“提升”映射函数以处理TTT
数据结构
*Main> mm a (Leaf [])
Leaf []
*Main> mm a (Leaf [1,2,3])
Leaf [1,4,9]
*Main> mm (\i -> i + 1) (Leaf [1,2,3])
Leaf [2,3,4]
*Main> mm (\i -> i + 1) (Node (Leaf [1,2,3]) (Leaf [4,5,6]))
Node (Leaf [2,3,4]) (Leaf [5,6,7])
Integer->Integer和TTT Integer->TTT Integer是什么意思?这是什么数据类型
Integer->Integer
表示以Integer
作为输入并返回整数的函数
TTT Integer->TTT Integer
(注意,我改变了大小写),同样地,表示一个函数,它接受一个TTT Integer
值作为输入,并返回一个TTT Integer
值。new_mm
根据定义与该函数相等。但是,类型签名仅限于整数
mm
似乎是map的一个变体,用于二叉树(具有列表叶子)的TTT
定义。如果您想了解更多关于代数数据类型的信息,请参见data TTT aa=…
定义,我建议您阅读。