在haskell中显示约束类型

时间:2018-11-15 00:31:19

标签: haskell functional-programming constraints bit

我正在尝试使用显示功能来打印到 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)’

你能告诉我我在做什么错吗?

1 个答案:

答案 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定义的showInt的实例。

一个麻烦的解决方法可能是强制执行“另一个方向”:每个Bits的实例都必须是Bits的实例,这样您就可以使用Show的{ {1}}实例,而不是您自己的实例:

a

尽管这需要显式的类型签名来解决呼叫站点上Show类型的歧义。