我有一个要求:
让我们考虑字符串之间的以下排序关系:s1小于s2如果s1短于s2或它们具有相同的长度并且s1在字典上更小比s2。用两个参数x和y编写一个名为ltstr的函数,该函数实现此顺序关系。编写一个获得2个参数的函数qs:一个列表和一个排序标准,然后对使用快速排序算法,根据给定的标准给出列表。例如:
Main> qs ["Russia","Norway","Germany","Romania", "France","Antigua and Barbuda","South Korea","Angola","Hungary"] ltstr
["Angola","France","Norway","Russia","Germany","Hungary","Romania","South Korea","Antigua and Barbuda"]
我不确定如何在Haskell中准确地传递函数作为参数。这是代码框架
\begin{code}
ltstr s1 s2 = if length(s1) < length(s2) then s1
else if length(s1) == length (s2) && s1 < s2 then s1
else s2
qs (l:ls) crit = (qs smalls crit) ++ [l] ++ (qs biggs crit)
where
smalls = [ s | s <- ls, (crit s l) == s]
biggs = [ b | b <- ls, (crit b l) == l]
\end{code}
Ordering
类型的Monoid
实例。只要您做对了,就可以简单地通过Data.List.sortBy :: (a -> a -> Ordering) -> [a] -> [a]
完成。
Data.List.sortBy :: (a -> a -> Ordering) -> [a] -> [a]
事物是sortByLengthThenLex :: [String] -> [String] sortByLengthThenLex = sortBy compareLengthThenLex where compareLengthThenLex :: String -> String -> Ordering compareLengthThenLex x y = (length x `compare` length y) <> (x `compare` y)
类型的Monoid
实例的定义,例如
Ordering
如果比较的左手边获得优先权,除非它们相等。相应地
instance Monoid Ordering where mempty = EQ LT `mappend` _ = LT EQ `mappend` y = y GT `mappend` _ = GT
注意:您可以将λ> sortByLengthAndLex ["Russia","Norway","Germany","Romania", "France","Antigua and Barbuda","South Korea","Angola","Hungary","USA","UK"] ["UK","USA","Angola","France","Norway","Russia","Germany","Hungary","Romania","South Korea","Antigua and Barbuda"]
运算符视为<>
的默认前缀版本。