1..n]がHaskellで[n..1]と同じように処理されないのはなぜですか?
質問
関数によってマッピングされた後、リストの最大値を必要とする問題を解決しようとしていました。リストは、AからBまでの範囲で、A> BまたはB> Aです。 Haskellは減少リストを定義できるため、a> bを確認する必要がなく、境界をB..aに逆転させる必要がないと思いました。関数はこのようになります:
f a b = maximum . map aFunction $ [a..b]
しかし、リストがIE A> Bを減少させている場合、Haskellは私に例外を与えてくれます。
Prelude.maximum: empty list
そのため、何らかの理由で、リストの減少が空のリストを越えて最大関数に渡ります。何故ですか?
そんなこと知ってる maximum
aの観点から定義されています foldl1 max
そしてそれ foldl1
空のリストが必要ですが、なぜリストがわかりません [10..1]
手渡されると空です foldl1
.
解決
[a..b]
デスガーへ enumFromTo a b
. 。標準の数値タイプ(フローティングのためのいくつかの癖)の場合、これはあなたがいるまでそれを追加し続けます >= b
. 。だからどこに b < a
これは空です。
次の構文を使用して、増分を変更できます [a,a'..b]
その後、それが増加します a'-a
. 。そう [10,9..1]
あなたが望むものになります。
他のヒント
これは、シーケンスがで定義される方法のためです Haskellは算術シーケンスを報告します:
e1..e3] = e1 e3へのenumfrom
E1 E3への配列列はリスト[E1、E1 + 1、E1 + 2、... E3]です。 e1> e3の場合、リストは空です。
(強調が追加されました)。
それらはまったく同じ方法で処理されます。最初のバウンドから始めてカウントアップします。