2011-11-24 9 views
20

なぜそれは私がHaskellで範囲を行うとき、これが機能することである:[LT .. GT]を使用するとき、なぜHaskellの範囲にスペースが必要なのですか?

[LT .. GT] 

が、これはそうではない:

[LT..GT] 

と、この不可解なエラーはどういう意味:

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

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

しかし、私はインツを使用すると、スペースなしの2番目のフォームが機能します。

[1..3] 
+0

どのようなエラーメッセージが表示されますか?私はそれを試したときにかなり有用なものを得ました... – delnan

+0

GHCiはそれを受け入れて '[1,2,3]'という結果になりました。たぶん、他のコンパイラが浮動小数点として '1'を読み込んだら、それは何の意味もありません。 – Hauleth

+0

@Hauleth:実際には '[1..3]'のためにうまくいきました。 – Tarrasch

答えて

27

LT..は、LTモジュールの.演算子と解釈されるためです。


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

これは、GHCがLTという名前のモジュールを見つけることができないことを意味します。 Haskellで

Prelude> SDJKASD.sdfhj 

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

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

sectionは、例えば、部分的なアプリケーションとの中置演算子である:同じメッセージは、非既存のライブラリで修飾名を使用している場合表示されます(* 3)であり、これは\x -> x * 3に相当します。

LT..は、.の中点演算子として解釈され、GTは、この演算子で形成されるセクションの一部です。

セクションは括弧で囲む必要があります。誤った解釈が行われないため、パーサーはこのように文句を言います。

エラーのもう一つの例:maximal munch ruleための

Prelude> [* 3] 

<interactive>:1:2: 
    A section must be enclosed in parentheses thus: (* 3) 
+7

...そしてモジュール名は '[0-9] +。*'の形式ではないかもしれないので、数字にあいまい性はありません。 –

+0

エラーのある質問を更新しましたか?それも説明できますか? – drozzy

+0

@drozzy:更新を参照してください。 – kennytm

16

LT..LTモジュール内(.)オペレータの修飾名として解釈されます。 Haskellで独自の演算子を定義することができるので、関数と同じように演算子の名前を完全修飾することができます。

これは、オペレータの名前が.で始まる範囲で使用される..のあいまいさにつながります。これは、最も長いマッチが勝つという最大マンスルールを使用して解決されます。

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

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

モジュール名は、大文字でそう1..を開始しなければならないとx..は修飾名にすることはできませんので[1..3]または[x..y]作品は、ある理由。ケニーとHammarのは、これが何を意味するかを説明した

+0

私は見る...しかし、私はそのような間違いをしたことをどのように知っているだろうか?私はエラーを表示するために質問を編集しました - あなたはそれを説明できますか? – drozzy

+0

@drozzy:ここでエラーメッセージが改善された可能性があります。 「LTのインターフェイスを読み込めません」というのは、基本的には「モジュールLTを見つけることができませんでした」ということです。問題を理解しやすくすると思います。 – hammar

+0

レクサーは、 'LT ..'とは違って' LT ..'を扱います(http://www.haskell.org/onlinereport/lexemes.html#sect2.4)(そのセクションの終わりの表を参照)。最初のエラーは 'LT'の欠如に由来します(インポートも定義もされていません)。 2番目のエラーでは、Haskellはまだ 'LT ... 'が不特定の固定性を持つ演算子であると仮定します(したがって、' \ ''を挿入します)。 '[演算子識別子]'を解析することができないので、 'LT ..GT'は実際には' \ x - > x \ 'LT .. \' GT'を書き込もうとしていますが、 '((LT' \ 'GT)]')で囲まれている場合に使用されます。 –

3

Failed to load interface for `LT':

LT..LTモジュールで.機能であると仮定されます。 LTモジュールがないので、通訳者は当然それを読み込むことができません。同じ静脈に沿って

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

LT..LTモジュールで.関数への参照であると仮定すると、あなたのインタプリタは明らかにあなたが」のために、角括弧の代わりに括弧を使用してのミスを犯したと仮定していますセクション "(セクションは、例えば、(+1)です)。

これは、ハスケル語では単なる厄介な小さな疣贅です。スペースを使用することを忘れないでください。

関連する問題