Algorithm 函数式编程习惯用法,在racket/haskell中计算最多4个数字而不发生变异

Algorithm 函数式编程习惯用法,在racket/haskell中计算最多4个数字而不发生变异,algorithm,haskell,functional-programming,scheme,racket,Algorithm,Haskell,Functional Programming,Scheme,Racket,我有一个4个变量a、b、c和d中字符串中四个字符出现次数的计数 现在,我想知道哪个字符出现的次数最多 我想要一个函数式编程习惯用法来解决这个问题 在Haskell中解决此问题的一种方法如下- foldl (\(count1, char1) (count2, char2) -> if count1 > count2 then (count1, char1) else (count2, char2)) (a, "A") (zip [b, c, d] ["B", "C", "D"])

我有一个4个变量a、b、c和d中字符串中四个字符出现次数的计数

现在,我想知道哪个字符出现的次数最多

我想要一个函数式编程习惯用法来解决这个问题

在Haskell中解决此问题的一种方法如下-

foldl (\(count1, char1) (count2, char2) -> if count1 > count2 then (count1, char1) else (count2, char2)) (a, "A")  (zip [b, c, d] ["B", "C", "D"])

有人有其他函数式编程习惯用法来解决这个问题吗?

在Haskell中,习惯用法是使用
maximumBy

Data.List Data.Ord>snd。maximumBy(比较fst)$zip[4,3,7,1]“abcd”
“c”

在Haskell中,惯用的方法是使用
maximumBy

Data.List Data.Ord>snd。maximumBy(比较fst)$zip[4,3,7,1]“abcd”
“c”

sort,group,maximum?sort,group,maximum?要将其置于惯用的关联列表形式中,并在combinator上介绍
,请使用
fst。maximumBy(compare`on`snd)
。顺便说一句,
这里的maximum
也会起作用,并进一步保证在平局中取最大字符。如果我们想变得非常迂腐,
maximumBy
在领带上没有定义,因为它的文档要求“函数被假定为定义一个总的顺序。”——这个要求对我的口味限制太多了,我想大多数Haskeller都会忽略它,因为实际的实现并不需要它。@chi
比较fst
是一个总体排序。允许总订单声明两个值相等。@DanielWagner Uhm,但比较fst(2,'a')(2,'b')
会得出
EQ
。我认为它是一个先序,但不是一个偏序,因此不是一个总的顺序。@ chi:一个总的顺序是“传递的,反对称的,总的”。通过比较fst(使用“returns
LT
EQ
”作为
的代理,您声称哪些属性不满足于
要将其置于惯用关联列表形式,并在
上引入
组合符,请使用
fst.maximumBy(compare`on`snd)
。顺便说一句,
最大值
在这里也会起作用,并进一步保证在领带上取最大的字符。如果我们想非常迂腐,则领带上的
最大值
是未定义的,因为它的文档要求“假定函数定义总顺序。”--这个要求对我的口味限制太多了,我想大多数Haskeller会忽略它,因为实际的实现并不需要它。@chi
比较fst
是一个总排序。总排序可以声明两个值相等。@DanielWagner Uhm,但是
比较fst(2,'a')(2,'b'))给出<代码> EQ 。我将它看作是一个序号,而不是一个偏序,因此不是一个总的顺序。@ chi:一个总的顺序是“传递的,反对称的,总和的”。你声称哪些属性不满足于<代码>比较FST (使用“返回<代码> Lt或<代码> EQ >”作为“代码>的代理”。