計算機科学のブログ

関数型プログラミングの基礎 - ファーストクラス関数 - 引数としての関数 - 例:カスタムソート、sortBy関数

入門Haskellプログラミング (Will Kurt(著)、株式会社クイープ(監修、翻訳)、翔泳社)の UNIT1(関数型プログラミングの基礎)、LESSON 4(ファーストクラス関数)、4.1(引数としての関数)、例:カスタムソート、クイックチェック 4-2の解答を求めてみる。

コード

sample2.hs

import Data.List (sortBy)
main :: IO ()
main = do
  print names
  print $ sortBy compareLastNames names
  print $ sortBy compareLastFirstNames names

names :: [(String, String)]
names = [("Ian", "Curtis"),
        ("Bernard", "Sumner"),
        ("Peter", "Hook"),
        ("Stephen", "Morris"),
        ("Peter", "Morris")]

compareLastNames :: (String, String) -> (String, String) -> Ordering
compareLastNames name1 name2 = if lastName1 > lastName2
    then GT
    else if lastName1 < lastName2
        then LT
        else EQ
    where lastName1 = snd name1
          lastName2 = snd name2

compareLastFirstNames :: (String, String) -> (String, String) -> Ordering
compareLastFirstNames name1 name2 = if lastName1 > lastName2
    then GT
    else if lastName1 < lastName2
        then LT
        else if firstName1 > firstName2
        then GT
        else if firstName1 < firstName2
        then LT
        else EQ
    where firstName1 = fst name1
          lastName1 = snd name1
          firstName2 = fst name2
          lastName2 = snd name2

入出力結果(Terminal, Zsh)

% runghc sample2.hs
[("Ian","Curtis"),("Bernard","Sumner"),("Peter","Hook"),("Stephen","Morris"),("Peter","Morris")]
[("Ian","Curtis"),("Peter","Hook"),("Stephen","Morris"),("Peter","Morris"),("Bernard","Sumner")]
[("Ian","Curtis"),("Peter","Hook"),("Peter","Morris"),("Stephen","Morris"),("Bernard","Sumner")]
%