我正在阅读一篇关于GHC 7.10.x Migration的文章.有一些修复错误的建议.
GHC说
No instance for (Applicative ...)如果GHC抱怨这一点
Foo.hs:7:10:没有实例声明的超类引起的(Applicative Foo)实例在'Monad Foo'的实例声明中,修复此错误的一种简单方法是定义一个Applicative(可能还有一个Functor) )instance:instance Functor Foo,其中fmap = liftM - 或者: - fmap = m >> = pure.F
Run Code Online (Sandbox Code Playgroud)instance Applicative Foo where -- NB: DO NOT USE `pure = return` pure = {- move the definition of `return` from the `Monad` instance here -} (<*>) = ap {- defined in Control.Monad -} -- or alternatively: -- f1 <*> f2 = f1 >>= \v1 -> f2 >>= (pure . v1) …
考虑以下功能:
foo :: Show a => Maybe a -> [Char]
foo (Just x) = show x
foo Nothing = "Nothing"
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用这个功能:
bar :: [Char]
bar = foo Nothing
Run Code Online (Sandbox Code Playgroud)
已传递给参数foo的类型是Maybe a其中a没有指定,而事实上,我们不关心a,因为我们只使用的情况下foo进行的Nothing.但GHC声称提供具体类型:
a0由于使用而产生的模糊类型变量foo
可防止约束(Show a0)被解决.可能的修复:使用类型注释来指定a0应该是什么.
GHC提示指定类型.所以我看到的唯一修复就是创建一个伪类型,它有一个Show类型为class 的实例:
{-# LANGUAGE EmptyDataDecls, KindSignatures #-}
{-# OPTIONS_GHC -fno-warn-missing-methods #-}
data Dummy :: *
instance Show Dummy
bar :: [Char]
bar = foo (Nothing :: Maybe …Run Code Online (Sandbox Code Playgroud)