30

Learn you a Haskellに従って、楽しく Haskell を学んでいます。を使用すると、範囲が数値で無限大になる可能性があります[1..]。文字の場合、範囲はどこで['a'..]止まりますか? Unicode テーブルの最後の文字だと思いますが、Haskell については何も知らないので、質問してください。

4

2 に答える 2

56

範囲がどこで終わるか知りたい場合は、最後の項目を取得してください…</p>

ghci> last ['a'.. ]
'\1114111'

別の方法:Char境界型、つまり最小値と最大値が定義された型です。Boundedクラスの型はmaxBound値を提供します。はポリモーフィックであるためmaxBound、探している値の型を明示的に指定する必要があります。

ghci> maxBound :: Char
'\1114111'
ghci> maxBound :: Int
9223372036854775807

それらは無制限であるため、 maxBoundforはありません。Integer

Haskellのプレリュードでは、['a'..]との関係が説明されていますmaxBound。表記法['a'..]は ; のシンタックス シュガーですenumFrom a。これは型クラスenumFromのメソッドです。EnumのドキュメントではEnum、型が のインスタンスでもある場合BoundedenumFrom xは と同等enumFromTo x maxBoundであるか、より読みやすいように と指定されています[x..] = [x..maxBound]。したがって、 の最後の要素は['a'..]と同じでなければなりませんmaxBound :: Char

last ['a'.. ]はリストを繰り返し処理しますが、最新のコンピューターは瞬く間に 100 万まで数えることができます。ぐるぐる回したくなるようなものではありませんが、一度だけ実行するものとしては大きな負担にはなりません。GHC の代わりに Hugs などのあまり最適化されていない実装で試してみると、結果を待つ必要があるかもしれません。対照的last [0..]に、ほぼ永遠にかかります。

于 2013-09-09T12:31:08.120 に答える