Haskell の初心者として、私は StackOverflow の評価の高い質問、新しい質問などを読んでいますが、今日は次の質問がありました。
「まあ、答えを見ずにやってみよう」と思いました。手始めに、私は次のように書きました。
neighborsDistance [] = []
neighborsDistance [a] = []
neighborsDistance (x:y:xs) = abs (x - y) : neighborsDistance (y:xs)
それから私はすることができminimum neighborsDistance [2,3,6,2,0,1,9,8] => 1
ました。
しかし、私はエッジケースがどのように機能するかについてはあまり気にしていなかったので、おそらくMaybeを使用してみようと思いました. 「たぶん」値を許容するように再帰ルールを適応させる方法が必要だったので、Hoogle でData.Maybeを調べたところ、fromMaybe
...これは私が望んでいたことのように見えました。
neighborsDistance [] = Nothing
neighborsDistance [a] = Just []
neighborsDistance (x:y:xs) = Just (abs (x - y) : fromMaybe [] neighborsDistance (y:xs))
しかし、それは私にnot in scope: fromMaybe
エラーを与えました。主な質問は、「なぜそれがうまくいかなかったのか」です。
もう1つの質問は、このようなものを見るときの一般的なHaskellの考え方についてです。これはMaybeの悪い使い方ですか?head
空のリストで呼び出されたときに例外がスローされるのに対して、Maybe 型が返されるのはなぜですか?
私が問題を得た質問は、距離計算を最小限の操作で統一しようとすることでした。大幅な効率を失うことなく、このように分割できると思います(最小、最大などで構成するなど)?