Haskell 这个GHC.Generic函数签名错误消息是什么意思?

Haskell 这个GHC.Generic函数签名错误消息是什么意思?,haskell,generics,Haskell,Generics,我在学哈斯克尔。为什么我不能在getName {-# LANGUAGE DeriveGeneric #-} module Main where import GHC.Generics data Person = Person { id :: Int , name :: String , age :: Int } deriving (Generic, Show) p = fro

我在学哈斯克尔。为什么我不能在
getName

{-# LANGUAGE DeriveGeneric #-}
module Main where

import GHC.Generics


data Person = Person { id   :: Int
                     , name :: String
                     , age  :: Int }
            deriving (Generic, Show)

p = from $ Person 12 "J" 12

getName :: (Rep Person) x -> String
-- getName :: Generic a => (Rep a) x -> String
----^ Err: Couldn't match type ‘Rep a0’ with ‘Rep a
getName f = concat [ moduleName f
                   , "_"
                   , datatypeName f
                   ]

n = getName p

只需省略
getName
的类型签名即可

在ghci会话中运行代码会产生以下结果:

ghci> :t getName
getName :: Datatype d => t d f a -> [Char]

ghci> getName p
"Lib9_Person"

ghci> :t getName p
getName p :: [Char]
注意:我的代码驻留在模块
Lib9
中,该模块解释了
getName p
的输出

如果要为其提供类型签名,请启用
KindSignatures
并使用:

getName :: Datatype d => (t :: * -> (* -> *) -> * -> *) d f a -> [Char]

Rep
是关联的类型同义词,即实际类型可以是任何类型,具体取决于特定类型类实例的实现。无法保证任何任意
a
Rep a
是与函数
moduleName
所需类型兼容的类型

Rep Person
之所以有效,是因为编译器能够检查
Generic Person
的类型类实例的关联类型是否符合
moduleName
所期望的类型(即
Datatype d=>td(f::*->*)a

代替使用
repa
您可以使用

getName :: Datatype d => t d (f :: * -> *) a -> String
getName f = concat [ moduleName f
                   , "_"
                   , datatypeName f
                   ]

尽管您还需要启用
KindSignatures
扩展。

谢谢您的回答。但是错误消息意味着什么呢?为什么不能使用“Rep a”而使用“Rep Person”?完整的错误消息提供了以下线索:
NB:“Rep”是一个类型函数,可能不是内射的