1
作爲練習,我想快速檢查應用型的同態屬性:如何快速檢查應用同態屬性?
純˚F< *>純X =純(FX)
當我嘗試寫的財產一般使用幻像類型的方式,我似乎遇到了無窮的'無法推斷'錯誤。在這一點上,我已經添加了許多類型的註釋到我的代碼中,但仍然遇到了這些錯誤。
我的代碼是:
{-# LANGUAGE ViewPatterns #-}
import Test.QuickCheck (quickCheck)
import Test.QuickCheck.Function (Fun, apply)
-- | phantom type
data T a = T
-- | pure f <*> pure x = pure (f x)
prop_homomorphism :: (Applicative f, Eq b, Eq (f b)) => (T a) -> (T (f b)) -> Fun a b -> a -> Bool
prop_homomorphism T T (apply -> g) x = (pure (g :: a -> b) <*> pure x :: (Applicative f, Eq (f b)) => f b) == (pure (g x) :: (A
pplicative f, Eq (f b)) => f b)
prop_maybeint :: IO()
prop_maybeint = do
quickCheck (prop_homomorphism (T :: T Int) (T :: T (Maybe Int)))
main = do
prop_maybeint
這一點讓錯誤是:
applicativehomomorphism.hs:11:40: error:
• Could not deduce (Eq (f0 b0)) arising from a use of ‘==’
from the context: (Applicative f, Eq b, Eq (f b))
bound by the type signature for:
prop_homomorphism :: (Applicative f, Eq b, Eq (f b)) =>
T a -> T (f b) -> Fun a b -> a -> Bool
at applicativehomomorphism.hs:10:1-98
The type variables ‘f0’, ‘b0’ are ambiguous
These potential instances exist:
instance Eq a => Eq (Maybe a) -- Defined in ‘GHC.Base’
instance (Eq a, Eq b) => Eq (a, b) -- Defined in ‘GHC.Classes’
instance (Eq a, Eq b, Eq c) => Eq (a, b, c)
-- Defined in ‘GHC.Classes’
...plus 13 others
...plus one instance involving out-of-scope types
(use -fprint-potential-instances to see them all)
• In the expression:
(pure (g :: a -> b) <*> pure x :: (Applicative f, Eq (f b)) => f b)
== (pure (g x) :: (Applicative f, Eq (f b)) => f b)
In an equation for ‘prop_homomorphism’:
prop_homomorphism T T (apply -> g) x
= (pure (g :: a -> b) <*> pure x ::
(Applicative f, Eq (f b)) => f b)
== (pure (g x) :: (Applicative f, Eq (f b)) => f b)
applicativehomomorphism.hs:11:41: error:
• Could not deduce (Applicative f0)
arising from an expression type signature
from the context: (Applicative f, Eq b, Eq (f b))
bound by the type signature for:
prop_homomorphism :: (Applicative f, Eq b, Eq (f b)) =>
T a -> T (f b) -> Fun a b -> a -> Bool
at applicativehomomorphism.hs:10:1-98
The type variable ‘f0’ is ambiguous
These potential instances exist:
instance Applicative IO -- Defined in ‘GHC.Base’
instance Applicative Maybe -- Defined in ‘GHC.Base’
instance Applicative ((->) a) -- Defined in ‘GHC.Base’
...plus two others
...plus two instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
• In the first argument of ‘(==)’, namely
‘(pure (g :: a -> b) <*> pure x ::
(Applicative f, Eq (f b)) => f b)’
In the expression:
(pure (g :: a -> b) <*> pure x :: (Applicative f, Eq (f b)) => f b)
== (pure (g x) :: (Applicative f, Eq (f b)) => f b)
In an equation for ‘prop_homomorphism’:
prop_homomorphism T T (apply -> g) x
= (pure (g :: a -> b) <*> pure x ::
(Applicative f, Eq (f b)) => f b)
== (pure (g x) :: (Applicative f, Eq (f b)) => f b)
applicativehomomorphism.hs:11:47: error:
• Couldn't match type ‘b’ with ‘b2’
‘b’ is a rigid type variable bound by
the type signature for:
prop_homomorphism :: forall (f :: * -> *) b a.
(Applicative f, Eq b, Eq (f b)) =>
T a -> T (f b) -> Fun a b -> a -> Bool
at applicativehomomorphism.hs:10:22
‘b2’ is a rigid type variable bound by
an expression type signature:
forall a1 b2. a1 -> b2
at applicativehomomorphism.hs:11:52
Expected type: a1 -> b2
Actual type: a -> b
• In the first argument of ‘pure’, namely ‘(g :: a -> b)’
In the first argument of ‘(<*>)’, namely ‘pure (g :: a -> b)’
In the first argument of ‘(==)’, namely
‘(pure (g :: a -> b) <*> pure x ::
(Applicative f, Eq (f b)) => f b)’
• Relevant bindings include
g :: a -> b (bound at applicativehomomorphism.hs:11:33)
prop_homomorphism :: T a -> T (f b) -> Fun a b -> a -> Bool
(bound at applicativehomomorphism.hs:11:1)
applicativehomomorphism.hs:11:112: error:
• Couldn't match type ‘b’ with ‘b1’
‘b’ is a rigid type variable bound by
the type signature for:
prop_homomorphism :: forall (f :: * -> *) b a.
(Applicative f, Eq b, Eq (f b)) =>
T a -> T (f b) -> Fun a b -> a -> Bool
at applicativehomomorphism.hs:10:22
‘b1’ is a rigid type variable bound by
an expression type signature:
forall (f1 :: * -> *) b1. (Applicative f1, Eq (f1 b1)) => f1 b1
at applicativehomomorphism.hs:11:126
Expected type: f1 b1
Actual type: f1 b
• In the second argument of ‘(==)’, namely
‘(pure (g x) :: (Applicative f, Eq (f b)) => f b)’
In the expression:
(pure (g :: a -> b) <*> pure x :: (Applicative f, Eq (f b)) => f b)
== (pure (g x) :: (Applicative f, Eq (f b)) => f b)
In an equation for ‘prop_homomorphism’:
prop_homomorphism T T (apply -> g) x
= (pure (g :: a -> b) <*> pure x ::
(Applicative f, Eq (f b)) => f b)
== (pure (g x) :: (Applicative f, Eq (f b)) => f b)
• Relevant bindings include
g :: a -> b (bound at applicativehomomorphism.hs:11:33)
prop_homomorphism :: T a -> T (f b) -> Fun a b -> a -> Bool
(bound at applicativehomomorphism.hs:11:1)
我一直是這樣的戰鬥了一會兒,我很堅持。我的問題是什麼?
嘗試啓用'{ - #語言ScopedTypeVariables# - }'然後'forall' - 量化你在體內提到的簽名中的任何類型變量。 – luqui