5️⃣
[Haskell] quicksortを実装する
すごいHaskellたのしく学ぼう!を読んでいるので、アウトプットします。
あくまで初学者のアウトプットなので、あまりイケてない記述があるかもしれません。
第4章で再帰関数を実装する問題があるので、自分なりの回答を載せます。
quicksort
本の回答
qi' :: (Ord t) => [t] -> [t]
qi' [] = []
qi' (x : xs) =
let smallOrEq = [a | a <- xs, a <= x]
large = [a | a <- xs, a > x]
in qi' smallOrEq ++ [x] ++ qi' large
letを使うのが思い浮かばなかった。
別解: whereを使う
qi' :: (Ord t) => [t] -> [t]
qi' [] = []
qi' (x : xs) =
qi' smallOrEq ++ [x] ++ qi' large
where
smallOrEq = [a | a <- xs, a <= x]
large = [a | a <- xs, a > x]
let,whereについて
-
let、whereとは局所的に(その場限りで)変数を使うための仕組み
-
letとは、その式の中だけで有効な変数を作る仕組み
let 一時的変数X = 〇〇
in (Xのある)式
- whereとは、それが修飾する直前の関数で有効な変数を定義する仕組み
関数 = (後で作るXやYを含む)定義
where
一時的な変数X = 〇〇
一時的な関数Y = 〇〇
参考
Discussion