我有一个要求:
让我们考虑一下字符串之间的以下排序关系: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}
答案 0 :(得分:0)
现在,此要求与排序算法无关。它只是乞求(def brackets ["()" "[]" "{}" "<>"])
(defn bracket [string brackettype]
(for [b brackets]
[(let [f (str (first b)) l (str (last b))]
(if (or (= brackettype f) (= brackettype l))
(def fstringl (str f string l))))])
bstringb)
(bracket "hello" "[")
=> #object[clojure.lang.Var$Unbound 0x6401b490 "Unbound: #'me.core/fstringl"]
类型的Ordering
实例。
只要您做对了,Data.List.sortBy :: (a -> a -> Ordering) -> [a] -> [a]
就可以轻松完成。
Monoid
事情是sortByLengthThenLex :: (Foldable t, Ord (t a)) => [t a] -> [t a]
sortByLengthThenLex = sortBy compareLengthThenLex
where
compareLengthThenLex :: (Foldable t, Ord (t a)) => t a -> t a -> 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"]
运算符视为<>
的默认中缀版本。