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 =

我正在学习如何在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 = 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=…
定义,我建议您阅读。