Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 无法显示haskell中实例函数的结果_Class_Haskell_Show_Instances - Fatal编程技术网

Class 无法显示haskell中实例函数的结果

Class 无法显示haskell中实例函数的结果,class,haskell,show,instances,Class,Haskell,Show,Instances,在ghci,我知道 class (Eq k, Ord k, Show k) => KEY k where keyBuild :: NumId -> NumId -> NumId -> k keyDummy :: k keyFromList :: [NumId] -> k -- keyGenerate :: (DATAPOOL p) => p -> Int -> [k] -- p = Pool k e s newt

在ghci,我知道

class (Eq k, Ord k, Show k) => KEY k where
  keyBuild    :: NumId -> NumId -> NumId  -> k
  keyDummy    :: k
  keyFromList :: [NumId] -> k
  -- keyGenerate :: (DATAPOOL p) => p -> Int -> [k]  -- p = Pool k e s


newtype PrimaryKey = PK (NumId, NumId, NumId) deriving (Eq, Ord, Show) 

instance KEY PrimaryKey where
  keyBuild k0 k1 k2 = PK (k0,k1,k2)
  keyDummy          = PK (0,0,0)
  keyFromList is    = keyFromList (take 3 (is ++ (replicate 3 0)))
  keyGenerate p cnt = let
                        ks = keys p
                        pks = map (\l ->  keyFromList (randomize l))                   (replicate cnt 3)
                      in pks
得到真值和k2的预期值,但是

let k1 = keyBuild 1 2 3
let k2 = PK (1,2,3)
k1 == k2 
True
k2
PK (1,2,3)
预期PK1,2,3 PrimaryKey具有派生Eq、Ord和Show,那么我做错了什么或错过了什么

您没有给k1一个固定类型。因为keyBuild可以用正确的实例构造任何类型的键,所以它具有多态类型k1::key k=>k。这很好,因为您可以将k1与不同混凝土类型的键进行比较。。。在您的例子中,您已经使用k2::PrimaryKey进行了尝试,但是您也可以使用k3::SomeOtherKeyType执行k1==k3,前提是SomeOtherKeyType也是KEY类的一个实例——在这种情况下,k1也可以简单地“接管”SomeOtherKeyType类型

另一方面,k1没有特定的类型。事实上,它可能是任何适用的类型,但是编译器如何知道您想要的类型呢?当使用==时,两边必须是相同的类型,因此在一边有一个具体的类型就足够了,但k1本身是不明确的

碰巧在您的模块中只有一个匹配的实例,即KEY PrimaryKey,但通常会有多个或零个!这样的例子。如果编译器只是随意选择一个,那会很奇怪,不是吗

因此,如果您想显示k1,您需要手动选择一种类型。很简单,只需添加一个本地签名:

k1
231:1: error:
    • Ambiguous type variable ‘a0’ arising from a use of ‘it’
      prevents the constraint ‘(KEY a0)’ from being solved.
      Probable fix: use a type annotation to specify what ‘a0’ should be.
      These potential instance exist:
        instance [safe] KEY PrimaryKey -- Defined at Work

测试中的NumId=Int
*Main> let k1 = keyBuild 1 2 3
*Main> :t k1
k1 :: KEY k => k
*Main> k1 :: PrimaryKey
PK (1,2,3)