`show`记录没有派生Show

时间:2018-03-25 05:39:18

标签: haskell

我经常需要在调试时打印一些内容,除非我需要看到的数据类型派生Show我无法打印它。对于某些数据类型,我无法将deriving (Show)添加到定义中,因为它可能位于库中或其他我无法访问的位置。

无论如何我可以打印这些数据类型进行调试吗?

3 个答案:

答案 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:强制

您可以使用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