2011-07-24 5 views
19

私はハスケルにとってとても新しいです。このようなリストを定義すると、空リストにハスケルの範囲を減らす

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] 

答えて

34

[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の場合、リストは空です。

+0

ありがとうございました、これは理にかなっています。一見すると、これはかなり愚かな表記だと思ったが、今度は範囲内のステップのサイズを定義できるようになった。とてもかっこいい!今度はHaskellについてとても興奮しています:) – Christopher

11

算術配列表記はEnumクラスの機能のためだけ糖衣構文です。

  • abが別の場所で定義されている場合、それはしにくいだろう。彼らは自動的に反転させるために定義されていなかった理由を、私は推測することができますが、ここではいくつかの可能な理由があるためとして

    [a..]  = enumFrom a 
    [a..b] = enumFromTo a b 
    [a, b..] = enumFromThen a b 
    [a, b..c] = enumFromThenTo a b c 
    

    どちらの方向に行くのか一目で教えてください。[a..b]

  • これには、理にかなった数学的特性があります。シーケンスを逆にする特別なケースを追加する必要はありません。

2

あなたは関係なく、かどうかa < baからbにリストを生成したい場合は、以下を使用することができます。

[a, a + (signum $ b - a)..b]

+1

'a = b'の場合、これは無限リストを生成することに注意してください。 – hammar

+0

@ハマー私は修正されました:) – dionyziz

関連する問題