Использование пользовательского типа 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
как есть.