Отсутствие выводов типа приводит к неисправности, не посвященные неисправности

Я озадачен, почему этот код компилирует с подсказками типа, но не скомпилируется без. Не должно быть никаких неоднозначных чисел (есть один экземпляр).

class Monad m => FcnDef β m | β -> m where
    def :: String -> β -- takes a name

instance Monad m => FcnDef (m α -> m α) m where
    def s body = body

dummyTest :: forall m. Monad m => m ()
dummyTest = def "dummy" ((return ()) :: m ())

С другой стороны, если кто-то пропускает :: M () , или все объявления типа, компиляции не удается с этой ошибкой,

No instance for (FcnDef (m0 () -> t0) m0)
  arising from a use of `def'

для разъяснения, код пытается сделать мульти -Ваварийный тип для def , так что можно написать, например,

def "dummy2" "input" $ \in -> return ()

Отредактируйте

Этот вопрос более пересекается, чем без рестрикции мономорфизма. Если кто-то добавляет такой код, затем разрешает экземпляры для конкретных типов, а именно

dummyTest = def "dummy" (return ())
g :: IO ()
g = dummyTest

Компиляция не удается аналогично.

5
задан hammar 29 August 2011 в 01:33
поделиться