我无法用一种功能性的思维方式来解决这个问题,这种方式也可以用于非常长的列表.如果您有以下列表:
["one", "two", "three", "four", "five"]
Run Code Online (Sandbox Code Playgroud)
我可以说出最长单词的长度非常简单:
maximum $ map length ["one", "two", "three", "four", "five"]
Run Code Online (Sandbox Code Playgroud)
如何修改前面的语句以返回字符串3?
sth*_*sth 38
使用maximumBy,on并且compare你可以写这样的表达:
import Data.List (maximumBy)
import Data.Function (on)
maximumBy (compare `on` length) ["one", "two", "three", "four", "five"]
Run Code Online (Sandbox Code Playgroud)
hvr*_*hvr 12
顺便说一下,如果一个没有现成的maximumBy,一个简单的方法就是装饰 - 排序 - 未装饰模式/习语(它也适用于其他语言,如Python或Scheme):
snd $ maximum $ map (\x -> (length x, x)) ["one", "two", "three", "four", "five"]
Run Code Online (Sandbox Code Playgroud)
但由于原始有效负载也是排序键的一部分,因此结果并不总是第一次出现最长的单词(在这种情况下,只有一个单词的长度最长)
这个函数(甚至库)似乎并不为人所熟知,但是Haskell实际上有一个模块Data.Ord,它包含的函数comparing几乎就像Data.Function.on在最顶层的答案中使用一样,除了代码最终更加惯用.
g>import Data.Ord
g>import Data.List
g>let getLongestElement = maximumBy (comparing length)
getLongestElement :: [[a]] -> [a]
g>getLongestElement ["one", "two", "three", "four", "five"]
"three"
Run Code Online (Sandbox Code Playgroud)
该代码实际上读起来像英语."通过比较长度获得最大值."