1..n]がHaskellで[n..1]と同じように処理されないのはなぜですか?

StackOverflow https://stackoverflow.com/questions/7349186

  •  27-10-2019
  •  | 
  •  

質問

関数によってマッピングされた後、リストの最大値を必要とする問題を解決しようとしていました。リストは、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

HaskellはEnumクラスを報告します

E1 E3への配列列はリスト[E1、E1 + 1、E1 + 2、... E3]です。 e1> e3の場合、リストは空です。

(強調が追加されました)。

それらはまったく同じ方法で処理されます。最初のバウンドから始めてカウントアップします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top