[LT .. GT]を使用するとき、なぜHaskellの範囲にスペースが必要なのですか?

なぜ私はHaskellで範囲を行うとき、これは動作しますか:

[LT .. GT]

しかしこれはしません:

[LT..GT]

この謎めいたエラーはどういう意味ですか?

:1:2:
    Failed to load interface for `LT':
      Use -v to see a list of the files searched for.

:1:2:
    A section must be enclosed in parentheses thus: (`LT..` GT)

しかし、私がインツを使用すると、2番目の形式(スペースなし)が機能します。

[1..3]
20
GHCiはそれを受け入れて [1,2,3] にします。たぶん、他のコンパイラが浮動小数点として 1。を読んだら、何らかの意味で緩んでいるかもしれません。
追加された 著者 Hauleth,
私はGHCでそれが動作すると言った。おそらく他のどのHaskellコンパイラでも、私が言ったように解析されます。
追加された 著者 Hauleth,
@Hauleth:実際には [1..3] ではうまくいきました。
追加された 著者 Tarrasch,
どのようなエラーメッセージが表示されますか?私はそれを試したときにかなり有用なものを得ました...
追加された 著者 delnan,

3 答え

LT モジュールの演算子として解釈されるからです。


:1:2:
    Failed to load interface for `LT':
      Use -v to see a list of the files searched for.

これは、GHCが LT という名前のモジュールを見つけることができないことを意味します。存在しないライブラリで修飾名を使用すると、同じメッセージが表示されます。

Prelude> SDJKASD.sdfhj

:1:1:
    Failed to load interface for `SDJKASD':
      Use -v to see a list of the files searched for.

:1:2:
    A section must be enclosed in parentheses thus: (`LT..` GT)

In Haskell, a section is an infix operator with a partial application, e.g. (* 3), which is equivalent to \x -> x * 3.

あなたの場合、 LT は中置演算子として解釈され、 GT はこの演算子で形成されるセクションの一部です。

セクションは括弧で囲まなければなりません。誤った解釈はしないので、パーサはこのように文句を言います。

エラーの別の例:

Prelude> [* 3]

:1:2:
    A section must be enclosed in parentheses thus: (* 3)
27
追加された
エラーのある質問を更新しました。それも説明できますか?
追加された 著者 drozzy,
ありがとうございます - それが私を幸せにします!
追加された 著者 drozzy,
@drozzy:アップデートを参照してください。
追加された 著者 kennytm,
...とモジュール名は [0-9] +。* の形式ではないかもしれないので、数字にあいまいさはありません。
追加された 著者 Fred Foo,

最大マンスルールのため、 LT .. は< LT モジュールの(。)演算子を使用します。 Haskellで独自の演算子を定義することができるので、関数と同じように演算子の名前を完全修飾することができます。

これは、オペレータの名前がで始まる場合に範囲内で使用される .. のあいまいさを招きます。最長の試合が勝利。

たとえば、 Prelude .. は、関数合成演算子の修飾名です。

> :info Prelude..
(.) :: (b -> c) -> (a -> b) -> a -> c   -- Defined in GHC.Base
infixr 9 .
> (+3) Prelude.. (*2) $ 42
87

[1..3] または [x..y] が機能する理由は、モジュール名が大文字で始まる必要があるためです。 .. と x .. は名前を修飾することはできません。

16
追加された
私は見る...しかし、私はどのように私はそのような間違いをしたことを知っているだろうか?私はエラーを表示するために質問を編集しました - あなたはそれを説明できますか?
追加された 著者 drozzy,
そしてそれは [ [1..3] の醜さで十分ではありますが、 .. の周囲にスペースを入れるもう一つの理由です。
追加された 著者 Daniel Fischer,
@drozzy:ここでエラーメッセージが改善された可能性があります。 「LTのインターフェイスを読み込めません」というのは、基本的には「モジュールLTを見つけることができませんでした」という意味です。問題を理解しやすくすると思います。
追加された 著者 hammar,
@Tinctorius:バッククォートは、資格を持っていても演算子では使用されません。私の Prelude .. の例を見てください。エラーメッセージに示された提案は間違っており、解析されません。最新のGHCがそのメッセージを提供している場合は、バグとして報告する必要があります。
追加された 著者 hammar,
レクサー LT .. とは異なります。 LT .. (このセクションの最後にある表を参照)。最初のエラーは、 LT が不足していることに由来します(インポートも定義もされていません)。 2番目のエラーでは、Haskellはまだ LT .. が固定されていない固定子を持つ演算子であると想定しています(したがって ` [operator Identifier] を解析できないため、 LT..GT は実際には \ x - > x `LT ... GT であるが、構文砂糖は括弧で囲んだときにのみ使用できる: [(LT ... GT)]
追加された 著者 user824425,
@ハマー:7.2.1でも起こります。 #5657 として報告されています。
追加された 著者 user824425,

'LT'のインターフェースをロードできませんでした:

KennyとHammarはこれが何を意味するのかを説明しました。 LT モジュールの関数とみなされます。 LT モジュールは存在しないため、インタプリタは当然ロードすることができません。

セクションはカッコで囲む必要があります( LT .. GT)

同じように、 LT モジュールが LT モジュールの関数への参照であると仮定すると、 "セクション"(セクションは例えば(+ 1))のために括弧の代わりに大括弧を使用して間違っていました。

これは単純にハスケル語の不快な小さな疣贅です。スペースを使用することを忘れないでください。

3
追加された