Подпись foldl
является:
foldl :: (<b>b -> a -> b</b>) -> b -> [a] -> b
Мы применяем foldl
с функцией (insertTree
), а также Tree
и список Int
s, так что это означает, что b ~ Tree Int
, и a ~ Int
.
Так что это означает, что построенный до сих пор Tree
должен быть первым аргументом здесь.
Мы можем решить эту проблему с помощью flip :: (a -> b -> c) -> b -> a -> c
:
let numsTree = foldl <b>(flip</b> treeInsert<b>)</b> EmptyTree nums
flip
переворачивает параметры, поэтому f x y == flip f y x
.
foldl
означает, что для списка [8,6,4]
мы будем применять его следующим образом:
insertTree 4 (insertTree 6 (insertTree 8 EmptyTree))
Мы также можем решить использовать foldr :: (b -> a -> b) -> b -> [a] -> b
(обратите внимание, что порядок параметров изменился), например:
let numsTree = <b>foldr</b> treeInsert EmptyTree nums
затем для списка [8,6,4]
это приведет к:
insertTree 8 (insertTree 6 (insertTree 4 EmptyTree))
Поскольку порядок, в котором элементывставлены в Tree
может иметь влияние, два семантически , не эквивалент.