7

これら 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。私は何かばかげたことを見逃しているに違いない?!

4

2 に答える 2

7

まず、両方を同時に 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 であると推測します。引数に使用される型が異なるため、動作は非常に驚くべき方法で異なる場合があります。特に、のようにリストを列挙するときは、必ず型のみを使用する必要があります。Fractionalt2sNumt1s 00Double0Integert2s 0Integral[1,3..n]

これを修正するには、両方の関数に明示的な型シグネチャを提供するだけです。

于 2013-02-22T03:56:39.420 に答える
6

それはという事実と関係があります

enumFromThenTo 1.0 3.0 0.0

に評価され[1.0]ます。Floatの仕様は、 http://www.haskell.org/onlinereport/haskell2010/haskellch6.htmlenumFromThenToのセクション 6.3.4 にあります。

于 2013-02-22T04:15:26.400 に答える