我正在尝试使用显示功能来打印到 zer 或 one 的控制台值,但是我不能这样做。这是我的代码:
{-# LANGUAGE NoMonomorphismRestriction #-}
import Control.Arrow
import Data.List
import qualified Data.Map as M
import Data.Function
class Eq a => Bits a where
zer :: a
one :: a
instance Bits Int where
zer = 0
one = 1
instance Bits Bool where
zer = False
one = True
instance Bits Char where
zer = '0'
one = '1'
我正在尝试使用功能 show 将zer或一个转换为字符串。 所以我尝试了:
k = zer
show k
但是我遇到了这个错误
<interactive>:10:1: error:
• Ambiguous type variable ‘a0’ arising from a use of ‘show’
prevents the constraint ‘(Show a0)’ from being solved.
Probable fix: use a type annotation to specify what ‘a0’ should be.
These potential instances exist:
instance (Show k, Show a) => Show (M.Map k a)
-- Defined in ‘containers-0.5.7.1:Data.Map.Base’
instance Show Ordering -- Defined in ‘GHC.Show’
instance Show Integer -- Defined in ‘GHC.Show’
...plus 24 others
...plus 11 instances involving out-of-scope types
(use -fprint-potential-instances to see them all)
• In the expression: show zer
In an equation for ‘it’: it = show zer
所以我试图为表演创建实例。所以我将其添加到了我的代码中:
instance (Show a) => Show (Bits a) where
show zer = "0"
show one = "1"
但是我又遇到了一个错误
main.hs:25:28: error:
• Expected a type, but ‘Bits a’ has kind ‘Constraint’
• In the first argument of ‘Show’, namely ‘Bits a’
In the instance declaration for ‘Show (Bits a)’
你能告诉我我在做什么错吗?
答案 0 :(得分:1)
您要使类成为类的实例,而不是使 type 成为类的实例。比较:
>>> df = pd.read_csv('file.csv',parse_dates=[0],converters={1:str.split})
>>> df
Date Numbers Extra NaN
0 2002-05-17 [15, 18, 25, 33, 47] 30
到
Show a => Show (Bits a) -- Invalid
其中Show a => Show (Maybe a) -- Valid
是数据类型,而Maybe
是类名。
我认为不可能表达“具有Bits
实例的任何事物都有Bits
实例”,因为它可能导致重叠实例:如果您可以定义类似的内容,那么当您使用Show
时,编译器将不知道是使用show :: Int -> String
的Prelude实例还是使用Show Int
定义的show
是Int
的实例。
一个麻烦的解决方法可能是强制执行“另一个方向”:每个Bits
的实例都必须是Bits
的实例,这样您就可以使用Show
的{ {1}}实例,而不是您自己的实例:
a
尽管这需要显式的类型签名来解决呼叫站点上Show
类型的歧义。