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