Как сослаться на уже существующую переменную типа в спецификации типа haskell?

Я хочу напечатать spec функцию f', определенную внутри функции f, чтобы обе их спецификации типа ссылались на одну и ту же переменную типа. Однако, когда я пытаюсь сделать это, я получаю ошибку компиляции от компилятора, которая предполагает, что m снаружи и m внутри не одного типа переменная. Любой совет, как это исправить?

f :: (Monad m) => (String -> Int -> String -> m ()) -> [String] -> m () 
f _ (x:_) = f' Nothing x
  where 
    f' :: (Maybe Int) -> String -> m () -- when I comment this line, the code compiles
    f' _ _ = return ()

main = undefined

2 ответа

Решение

Проверьте http://www.haskell.org/haskellwiki/Scoped_type_variables

По ссылке:Scoped Type Variables are an extension to Haskell's type system that allow free type variables to be re-used in the scope of a function.

Haskell 98 Prelude также содержит функцию asTypeOf который может использоваться для имитации определенной степени переменных типа (если вы используете компилятор, который не поддерживает XScopedTypeVariables).

См. http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html

Другие вопросы по тегам