點燈坊

失くすものさえない今が強くなるチャンスよ

Haskell 之 List 排序

Sam Xiao's Avatar 2020-02-05

sortBy 也是代表性 Higher Order Function,可自行傳入 Comparator Function 明確指定該如何比較與排序。

Version

Haskell for Mac 1.8.2

sort

import Data.List

f = sort

books = [
  ("FP in JavaScript", 100),
  ("Elm in Action", 200),
  ("Speaking JavaScript", 300)
]

f books

books 為 list 內放 tuple,若要對 books 排序,首先需 import Data.List,然後才能使用 sort

Haskell 的 tuple 使用 ()

sort000

不過 sort 預設只對 tuple 第一個 element 做排序,若想對第二個 element 做排序,則必須改用 sortBy

sortBy

import Data.List

price book1 book2 = 
  let 
    price1 = snd book1
    price2 = snd book2
  in  
    if price1 > price2
    then GT
    else if price1 < price2
    then LT
    else EQ
    
f = sortBy price

books = [
  ("FP in JavaScript", 100),
  ("Elm in Action", 200),
  ("Speaking JavaScript", 300)
]

f books

第 3 行

price book1 book2 = 
  let 
    price1 = snd book1
    price2 = snd book2
  in  
    if price1 > price2
    then GT
    else if price1 < price2
    then LT
    else EQ

定義 price comparator function,需提供兩個 argument,先在 in 使用 snd 取得 tutple 的第二個 element。

  • price1 > price2 則回傳值 GT,相當於 greater than
  • price1 < price2 則回傳值 LT,相當於 less than
  • 否則回傳值 EQ,相當於 equal

14 行

f = sortBy price

price 傳給 sortBy 以 Point-free 形式組合 f

sort001

Conclusion

  • Haskell 的 sortBy 與 Ramda 的 sort 觀念類似,需自行提供 comparator function