Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 仅使用比较运算符计算列表中每个元素的频率_Haskell - Fatal编程技术网

Haskell 仅使用比较运算符计算列表中每个元素的频率

Haskell 仅使用比较运算符计算列表中每个元素的频率,haskell,Haskell,我是Haskell的新手,我必须计算列表中元素的频率,并将其返回到键值对列表中,其中key是列表中的元素,value是它在列表中出现的次数。例如: 对于输入[0,2,2,0,2,5,0,2]输出应[(0,3)、(2,4)、(5,1)] 这里的问题是我们必须在不使用任何预定义函数的情况下进行比较 import Data.Map (fromListWith, toList) frequency :: (Ord a) => [a] -> [(a, Int)] frequency xs =

我是Haskell的新手,我必须计算列表中元素的频率,并将其返回到键值对列表中,其中key是列表中的元素,value是它在列表中出现的次数。例如:

对于输入
[0,2,2,0,2,5,0,2]
输出应
[(0,3)、(2,4)、(5,1)]

这里的问题是我们必须在不使用任何预定义函数的情况下进行比较

import Data.Map (fromListWith, toList)

frequency :: (Ord a) => [a] -> [(a, Int)]
frequency xs = toList (fromListWith (+) [(x, 1) | x <- xs])
import Data.Map(fromListWith,toList)
频率::(Ord a)=>[a]->[(a,Int)]
频率xs=toList(fromListWith(+)[(x,1)| x试试这个

freq:: (Ord a) => [a] -> [(a, Int)]
freq []      = []
freq (x: xs) = ins x (freq xs)
   where 
      ins :: (Ord a) => a -> [(a, Int)] -> [(a, Int)]
      ins x ((fk, fv): fs) | x == fk = (fk, fv + 1): fs 
      ins x ((fk, fv): fs) | x <  fk = (x, 1): (fk, fv): fs       
      ins x ((fk, fv): fs)           = (fk, fv): ins x fs             
      ins x []                       = (x, 1): []             
如果当前元素小于key,则在映射中插入新条目

ins x ((fk, fv): fs) | x <  fk = (x, 1): (fk, fv): fs

最后一部分是简单地处理map为空时的情况。

值总是有序的吗?不一定是[0,2,2,0,2,5,0,2]=[(0,3),(2,4),(5,1)]。这可能是一个更好的例子,您可以始终查找
toList
fromList
的定义
也是一个预定义的函数,不清楚任意限制所涵盖的内容。您可以省略第二个和第三个
ins x((fk,fv):fs)
而使用
ins x((fk,fv):fs)|x==fk=…|x
。此外,向初学者添加简短的代码解释总是一个好主意,因为给出解决方案对他们没有帮助(除非他们只是想避免做一些家庭作业)是的。我非常感谢@talex提供的代码的帮助。我不太明白fv是什么。我把代码改成如下:INSX((fk,fv):fs==fk=(fk,fv+4):fs所以fr一个矩阵[8,8,9,7],我们得到[(7,5),(8,5),(9,1)]我稍微扩展了我的答案。
ins x ((fk, fv): fs) | x <  fk = (x, 1): (fk, fv): fs
ins x ((fk, fv): fs)           = (fk, fv): ins x fs