Я озадачен, почему этот код компилирует с подсказками типа, но не скомпилируется без. Не должно быть никаких неоднозначных чисел (есть один экземпляр).
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
Компиляция не удается аналогично.