我经常需要在调试时打印一些内容,除非我需要看到的数据类型派生Show
我无法打印它。对于某些数据类型,我无法将deriving (Show)
添加到定义中,因为它可能位于库中或其他我无法访问的位置。
无论如何我可以打印这些数据类型进行调试吗?
答案 0 :(得分:7)
类型定义上的deriving
子句不是唯一的派生方式。您还可以使用StandaloneDeriving
GHC语言扩展名。
λ> :set -XStandaloneDeriving
λ> data Person = Human { name :: String, age :: Int } | Dog { goodPupper :: Bool }
λ> deriving instance Show Person
λ> Human "Chris" 31
Human {name = "Chris", age = 31}
如果类型有Generic
个实例,您可以使用gshowsPrecdefault
包中的generic-deriving函数对其进行字符串化。
λ> import GHC.Generics
λ> import Generics.Deriving.Show
λ> data Person = Human { name :: String, age :: Int } | Dog { goodPupper :: Bool } deriving Generic
λ> putStrLn $ gshowsPrecdefault 0 (Dog True) ""
Dog {goodPupper = True}
您可以使用GHCi中的:force
命令检查值。
λ> data Person = Human { name :: String, age :: Int } | Dog { goodPupper :: Bool }
λ> x = Human "Chris" 31
λ> x
<interactive>:17:1: error:
• No instance for (Show Person) arising from a use of ‘print’
• In a stmt of an interactive GHCi command: print it
λ> :force x
x = <Human> "Chris" 31
请参阅GHC手册中的Breakpoints and inspecting variables。
答案 1 :(得分:1)
您绝对可以打印没有Show
个实例的内容。
data MyType a = MyType Int a
showMyType :: (a -> String) -> MyType a -> String
showMyType f (MyType n a) =
"MyType " ++ show n ++ " (" ++ f a ++ ")"
答案 2 :(得分:0)
如果要以任何方式打印,必须使数据类型为Show
的实例。如果您不想派生Show
,您可以随时自行实施。
data Foo = Bar
instance Show Foo where
show Bar = "This is Bar"
main = print f where f = Bar