関数型プログラミングの基礎 - ファーストクラス関数 - 引数としての関数 - 例:カスタムソート、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")]
%