これら 2 つの同様のリスト内包表記が異なる結果をもたらす理由がわかりません。
Prelude> let t2s n= [ 1/(2*i) | i <- [1,3..n]]
Prelude> t2s 0
[0.5]
Prelude> let t2s n= [ (2*i) | i <- [1,3..n]]
Prelude> t2s 0
[]
[]
私は両方が引数に戻ることを期待していました0
。私は何かばかげたことを見逃しているに違いない?!
これら 2 つの同様のリスト内包表記が異なる結果をもたらす理由がわかりません。
Prelude> let t2s n= [ 1/(2*i) | i <- [1,3..n]]
Prelude> t2s 0
[0.5]
Prelude> let t2s n= [ (2*i) | i <- [1,3..n]]
Prelude> t2s 0
[]
[]
私は両方が引数に戻ることを期待していました0
。私は何かばかげたことを見逃しているに違いない?!
まず、両方を同時に ghci にロードできるように、t2s
最初の名前を に変更しました。t1s
それぞれの推定型を見てください。
[ts.hs:2:1-33] *Main> :t t1s
t1s :: (Enum t, Fractional t) => t -> [t]
[ts.hs:2:1-33] *Main> :t t2s
t2s :: (Enum t, Num t) => t -> [t]
[ts.hs:2:1-33] *Main>
は引数をt1s
取るのに対し、 . を取ることに注意してください。これは、では が であると推測されることを意味します。一方、インタプリタはin であると推測します。引数に使用される型が異なるため、動作は非常に驚くべき方法で異なる場合があります。特に、のようにリストを列挙するときは、必ず型のみを使用する必要があります。Fractional
t2s
Num
t1s 0
0
Double
0
Integer
t2s 0
Integral
[1,3..n]
これを修正するには、両方の関数に明示的な型シグネチャを提供するだけです。
それはという事実と関係があります
enumFromThenTo 1.0 3.0 0.0
に評価され[1.0]
ます。Floatの仕様は、 http://www.haskell.org/onlinereport/haskell2010/haskellch6.htmlenumFromThenTo
のセクション 6.3.4 にあります。