私はハスケルにとってとても新しいです。このようなリストを定義すると、空リストにハスケルの範囲を減らす
ghci> let myList = [10..1]
ghci> myList
[]
を返し、なぜ誰かがしかし、これは正しく動作について説明してもらえます。
基本的ghci> let myList = [10, 9..1]
ghci> myList
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
私はハスケルにとってとても新しいです。このようなリストを定義すると、空リストにハスケルの範囲を減らす
ghci> let myList = [10..1]
ghci> myList
[]
を返し、なぜ誰かがしかし、これは正しく動作について説明してもらえます。
基本的ghci> let myList = [10, 9..1]
ghci> myList
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
、[10..1]
が10
(含む)から(ステップサイズ+1
で)上向きにカウントから生じたすべての要素より少なくより1
取ることによってリストを作成する意味を有する自体enumFromTo 10 1
に変換されるからです。 [10, 9..1]
一方
を明示的9-10
として計数ステップサイズを述べenumFromToThen 10 9 1
、すなわちより正確な仕様はHaskellレポートに見出すことができる
(enumFromTo
ため+1
にハードコードされている)-1
(に変換され6.3.4ザ列挙型クラス):
enumFrom :: a -> [a] -- [n..]
enumFromThen :: a -> a -> [a] -- [n,n'..]
enumFromTo :: a -> a -> [a] -- [n..m]
enumFromThenTo :: a -> a -> a -> [a] -- [n,n'..m]
タイプInt
についてと
Integer
、列挙関数は肝炎e。次の意味:
シーケンス
enumFrom e1
はリスト[e1,e1+1,e1+2,...]
です。シーケンス
enumFromThen e1 e2
は、リスト[e1,e1+i,e1+2i,...]
で、増分iはe2-e1です。増分はゼロまたは負であってもよい。増分がゼロの場合、すべてのリスト要素は同じです。
enumFromTo e1 e3
は、リスト[e1,e1+1,e1+2,...e3]
です。e1 > e3
の場合、リストは空です。シーケンス
enumFromThenTo e1 e2 e3
は、リスト[e1,e1+i,e1+2i,...e3]
であり、増分はi
であり、e2-e1
である。インクリメントが正またはゼロの場合、リストは次の要素がe3
より大きい場合に終了します。e1 > e3
の場合、リストは空です。インクリメントが負の場合、リストは次の要素がe3
より小さくなると終了します。e1 < e3
の場合、リストは空です。
算術配列表記はEnum
クラスの機能のためだけ糖衣構文です。
a
とb
が別の場所で定義されている場合、それはしにくいだろう。彼らは自動的に反転させるために定義されていなかった理由を、私は推測することができますが、ここではいくつかの可能な理由があるためとして
[a..] = enumFrom a
[a..b] = enumFromTo a b
[a, b..] = enumFromThen a b
[a, b..c] = enumFromThenTo a b c
どちらの方向に行くのか一目で教えてください。[a..b]
これには、理にかなった数学的特性があります。シーケンスを逆にする特別なケースを追加する必要はありません。
ありがとうございました、これは理にかなっています。一見すると、これはかなり愚かな表記だと思ったが、今度は範囲内のステップのサイズを定義できるようになった。とてもかっこいい!今度はHaskellについてとても興奮しています:) – Christopher