Jer*_*rry 2 sorting tree haskell
我试图找出这里的树木究竟是如何工作的(我理解flatten,insert和foldr).
我想在treesort中正在做的是为列表中的每个元素应用insert,从而生成一个树然后展平它.我在这里无法克服的唯一问题是列表(即函数的参数)是隐藏的(因为除了函数类型声明之外,它不会作为参数写在任何地方).
还有一件事:因为点运算符是函数组合,为什么当我改变时它是一个错误:treesort = flatten . foldr insert Leafto treesort = flatten( foldr insert Leaf )?
在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应该应用于单个树,而不是函数.
先回答你的最后一个问题,因为你得到一个错误.是一个功能复合算,它有两个功能(在这种情况下,flatten和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)
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)