2011-07-17 72 views
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 
+0

我不同意這是重複的。是的,他們關注的是同一個基本問題,但是這個問題是一般的,在這個問題是具體的。有人搜索這個問題的具體實例並不需要知道限制條件的全部細節,他們只需要如何解決問題的具體建議 - 特別是,他們需要知道這樣的一個正確的類型簽名功能會。 – Jules

回答

19

我想你已經對跑了錯誤類型單態限制。這個限制意味着:如果一個變量沒有明確的參數聲明,它的類型必須是單形的。這迫使typechecker挑選Stream的特定實例,但它無法做出決定。

有兩種方法打吧:

  1. simple一個明確的簽名:

    simple :: Stream s m Char => ParsecT s u m Char 
    simple = letter 
    
  2. 禁用monorphism限制:

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

What is the monomorphism restriction?有關單態限制的更多信息。

+0

哦,通常情況下,當發生這種情況時,您會收到一個錯誤,指出「由於單態限制而無法執行此操作」。 – Peter

+1

我不知道這是爲什麼。它可能與GHC 7中的新型推理引擎有關。 – fuz