5️⃣

[Haskell] quicksortを実装する

2024/01/25に公開

すごい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とは、それが修飾する直前の関数で有効な変数を定義する仕組み
関数 = (後で作るXYを含む)定義
  where
    一時的な変数X = 〇〇
    一時的な関数Y = 〇〇

参考

https://zenn.dev/masahiro_toba/articles/7a60ea19b08208

Discussion