在Haskell中理解树木的问题

Jer*_*rry 2 sorting tree haskell

我试图找出这里的树木究竟是如何工作的(我理解flatten,insert和foldr).

我想在treesort中正在做的是为列表中的每个元素应用insert,从而生成一个树然后展平它.我在这里无法克服的唯一问题是列表(即函数的参数)是隐藏的(因为除了函数类型声明之外,它不会作为参数写在任何地方).

还有一件事:因为点运算符是函数组合,为什么当我改变时它是一个错误:treesort = flatten . foldr insert Leafto treesort = flatten( foldr insert Leaf )

Nor*_*sey 8

在treesort中正在做的是为列表中的每个元素应用insert,从而生成一个树然后展平它.

非常正确.

[列表隐藏在哪里?]

在函数式语言中,您不必提供函数类型值的参数.例如,如果我写

f = concat . map (map toUpper) 
Run Code Online (Sandbox Code Playgroud)

我得到了一个类型的功能[[Char]] -> [Char].即使定义方程中没有参数,此函数也需要参数.这我写的完全一样

f strings = (concat . map (map toUpper)) strings
Run Code Online (Sandbox Code Playgroud)

由于点运算符是函数组合,为什么f . g改为f (g)

它们并不代表同一件事.每个应用时会发生什么x

(f . g) x  = f (g x)

(f (g)) x  = (f g) x
Run Code Online (Sandbox Code Playgroud)

你可以看到关联的应用程序不同,并且f. g是从不同的f g.

这是一个类型错误,因为foldr insert Leaf它是从列表到树的函数,并且flatten应该应用于单个树,而不是函数.


Tom*_*cek 6

先回答你的最后一个问题,因为你得到一个错误.是一个功能复合算,它有两个功能(在这种情况下,flattenfoldr insert Leaf).如果你想在不使用的情况下重写代码.,你需要创建一个带有一些参数的函数:

-- // Pass the 'list' to the first function and the 
-- // result of the call to the second function
treesort list = flatten (foldr insert Leaf list)
Run Code Online (Sandbox Code Playgroud)

这也解释了list参数隐藏的位置.在编写函数时,您不需要显式地编写参数,因为表达式的结果f . g是一个函数,它接受一些参数,调用g然后调用f:

-- // function composition..
composed = f . g
-- // ..is equivalent to declaring a function:
composed x = f (g x)
Run Code Online (Sandbox Code Playgroud)