List Haskell如何使用fold函数重写代码?

List Haskell如何使用fold函数重写代码?,list,sorting,haskell,histogram,fold,List,Sorting,Haskell,Histogram,Fold,我想用折叠函数重写(或升级):)我的两个函数,hist和sort。但由于我只是在我的哈斯克尔方式的开始,我不知道如何做到这一点 首先,我定义了插入,表,并导入了数据.Char: type Insertion = (Char, Int) type Table = [Insertion] import Data.Char 然后,我为hist实现了以下代码: hist :: String -> Table hist[] = [] hist(x:xs) = sortBy x (hist xs)

我想用折叠函数重写(或升级):)我的两个函数,
hist
sort
。但由于我只是在我的哈斯克尔方式的开始,我不知道如何做到这一点

首先,我定义了
插入
,并导入了
数据.Char

type Insertion = (Char, Int)
type Table = [Insertion]
import Data.Char
然后,我为
hist
实现了以下代码:

hist :: String -> Table
hist[] = []
hist(x:xs) = sortBy x (hist xs) where
    sortBy x [] = [(x,1)]
    sortBy x ((y,z):yzs)
      | x == y = (y,z+1) : yzs 
      | otherwise = (y,z) : sortBy x yzs
这一个用于排序:

sort :: Ord a => [a] -> [a]
sort [] = []
sort (x:xs) = paste x (sort xs)

paste :: Ord a => a -> [a] -> [a]
paste y [] = [y]
paste y (x:xs)
    | x < y = x : paste y xs 
    | otherwise = y : x : xs
排序::Ord a=>[a]->[a] 排序[]=[] 排序(x:xs)=粘贴x(排序xs) 粘贴::Ord a=>a->[a]->[a] 粘贴y[]=[y] 粘贴y(x:xs) |x
下一步我能做什么?如何使用折叠函数来实现它们?

列表上的foldr f z
将列表中的“cons”替换为
f
,将空列表中的“cons”替换为
z

这意味着对于像
[1,4,2,5]
这样的列表,我们因此获得
f1(f4(f2(f5z))
,因为
[1,4,2,5]
1:4:2:5:[]
或更规范的
(:)1((:)4((:)2(:)5[])

例如,
排序
功能可以替换为折叠功能:

sort :: Ord a => [a] -> [a]
sort = foldr paste []
因为
排序[1,4,2,5]
相当于
粘贴1(粘贴4(粘贴2(粘贴5[]))
。因此,这里
f
将元素作为第一个参数,并将调用列表其余部分的
foldr f z
的结果作为第二个参数


我把
hist
留作练习。

sort
看起来可能只是
foldr-paste[]
hist
做什么?@user:我想它会计算字符串中每个
Char
的频率。它也可以用
foldr
实现。您的
sortBy
函数不需要它的第一个参数,因为
x
总是相同的。但是,如果您在外部按原样提取它,您将看到如何将
hist
重构为
foldr
,方法与
sort
相同。