使用自定义data
类型通常是更好的选择,但如果你真的想使用的元组,你可以通过定义将基于的第一个元素于辅助功能comparingFst
启动元组。
import Data.Ord
import Data.List
-- Dummy data types for example purposes. Derive from Show just so
-- that the example can be more easily tested interactively in ghci.
data Aa = Aa deriving Show
data Cc = Cc deriving Show
type Something = (Float, Float, Int, Aa, Cc, Int)
comparingFst :: Something -> Something -> Ordering
comparingFst = comparing fstSomething
where fstSomething (x,_,_,_,_,_) = x
现在您可以用较小的两个要素:
findMin :: Something -> Something -> Something
findMin x y = case comparingFst x y of
LT -> x
_ -> y
或元素
findMinimum :: [Something] -> Something
findMinimum = minimumBy comparingFst
的服务,您也可以使用相同的辅助函数进行排序:
sortSomethings :: [Something] -> [Something]
sortSomethings = sortBy comparingFst
另外,值得一提的是,默认情况下,元组从第一个元素开始进行元素比较,因此假设您的Aa
和Bb
类型可以从Ord
和Eq
派生,则不需要任何额外的东西,即示例变为:
import Data.List
data Ab = Ab deriving (Show, Ord, Eq)
data Cc = Cc deriving (Show, Ord, Eq)
type Something = (Float, Float, Int, Ab, Cc, Int)
findMin :: Something -> Something -> Something
findMin x y = min x y
findMinimum :: [Something] -> Something
findMinimum = minimum
sortSomethings :: [Something] -> [Something]
sortSomethings = sort
换句话说,你可以使用标准的min
和sort
功能原样。
“fst”和“snd”仅适用于具有两个元素的元组。对于任何事情,你可能比其他人建议的“数据某事= ...”更好。 – 2011-04-28 07:13:55