Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting 理解Haskell中treesort的问题_Sorting_Haskell_Tree - Fatal编程技术网

Sorting 理解Haskell中treesort的问题

Sorting 理解Haskell中treesort的问题,sorting,haskell,tree,Sorting,Haskell,Tree,我试图弄清楚treesort到底是如何工作的(我理解展平、插入和折叠) 我假设treesort中要做的是为列表中的每个元素应用insert,从而生成一棵树,然后将其展平。这里我唯一无法克服的问题是列表(即函数的参数)隐藏在哪里(因为除了函数类型声明之外,它没有作为参数写入任何地方) 还有一件事:既然点运算符是函数合成,为什么我更改时会出错:treesort=flatten。foldr insert Leaf到treesort=flatte(foldr insert Leaf)?首先回答上一个问题

我试图弄清楚treesort到底是如何工作的(我理解展平、插入和折叠)

我假设treesort中要做的是为列表中的每个元素应用insert,从而生成一棵树,然后将其展平。这里我唯一无法克服的问题是列表(即函数的参数)隐藏在哪里(因为除了函数类型声明之外,它没有作为参数写入任何地方)


还有一件事:既然点运算符是函数合成,为什么我更改时会出错:
treesort=flatten。foldr insert Leaf
treesort=flatte(foldr insert Leaf)

首先回答上一个问题,您会遇到一个错误,因为
是一个函数组合运算符,它包含两个函数(在本例中为
flatte
foldr 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)
这也解释了
列表
参数的隐藏位置。在编写函数时,不需要显式地编写参数,因为表达式
f的结果。g
是一个函数,它接受一些参数,调用
g
,然后调用
f

-- // function composition..
composed = f . g
-- // ..is equivalent to declaring a function:
composed x = f (g x)
treesort中所做的是为列表中的每个元素应用insert,从而生成一棵树,然后将其展平

完全正确

[列表隐藏在哪里?]

在函数式语言中,不必给出函数类型值的参数。例如,如果我写

f = concat . map (map toUpper) 
我得到一个
[[Char]]->[Char]
类型的函数。这 函数需要一个参数,即使定义方程中没有参数。 就像我写的一样

f strings = (concat . map (map toUpper)) strings
既然点运算符是函数合成,为什么更改
f是错误的。g
f(g)

它们的意思不一样。当每个应用于
x
时会发生什么

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

(f (g)) x  = (f g) x
您可以看到应用程序以不同的方式关联,并且
f。g
与f g不同


这是一个类型错误,因为
foldr insert Leaf
是一个从列表到树的函数,而
flatte
旨在应用于单个树,而不是一个函数。

有时,只要您不熟悉无意义的样式,就可以在心里进行ε转换

如果f是函数类型的表达式,则可以将其转换为 \e->(f)e

如果我们有这样的定义

a = \e -> (f) e
我们总是可以安全地将其重写为

a e = (f) e
因此

treesort list = (flatten . foldr insert Leaf) list

严格来说,链接处的treesort函数采用的是列表参数,而不是树,因此“树”可能不是变量名的最佳选择。@Peter:是的,我也意识到了这一点-谢谢你的更正。我不确定
f strings=…
f=\strings->…
是一样的。@ony:这是一样的,就像
[“a”,“b”]
“a”:“b”:[]一样;它们是书写相同值的两种不同方式。
treesort list = (flatten . foldr insert Leaf) list