我正在学习Haskell。为什么我无法将Person
更改为a
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
答案 0 :(得分:1)
只需省略$digest
的类型签名。
在ghci会话中运行代码会产生以下结果:
getName
注意:我的代码位于模块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