我希望在函数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
答案 0 :(得分:4)
检查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.
答案 1 :(得分:1)
Haskell 98 Prelude还包含一个函数asTypeOf
,它可用于在一定程度上模仿范围类型变量(如果使用不支持XScopedTypeVariables的编译器)。
请参阅http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:asTypeOf