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
相同。