16

この些細なパーセクコードをコンパイルしようとしています

import Text.Parsec
simple = letter

しかし、私はこのエラーが発生し続けます

No instance for (Stream s0 m0 Char)
  arising from a use of `letter'
Possible fix: add an instance declaration for (Stream s0 m0 Char)
In the expression: letter
In an equation for `simple': simple = letter
4

1 に答える 1

19

あなたは単相制限に反対したと思います。この制限は次のことを意味します。変数が明示的な引数なしで宣言されている場合、その型は単相である必要があります。これにより、タイプチェッカーはの特定のインスタンスを選択するように強制されますがStream、決定することはできません。

それと戦うには2つの方法があります。

  1. simple明示的な署名を与える:

    simple :: Stream s m Char => ParsecT s u m Char
    simple = letter
    
  2. モニック射撃制限を無効にします。

    {-# LANGUAGE NoMonomorphismRestriction #-}
    import Text.Parsec
    simple = letter
    

単相制限とは何ですか?を参照してください。単相制限の詳細については。

于 2011-07-17T10:34:54.107 に答える