λ> :set -XStandaloneDeriving
λ> data Person = Human { name :: String, age :: Int } | Dog { goodPupper :: Bool }
λ> deriving instance Show Person
λ> Human "Chris" 31
Human {name = "Chris", age = 31}
λ> 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
您可以在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
4条答案
按热度按时间k97glaaz1#
独立派生
类型定义上的
deriving
子句并不是唯一的派生方式。您也可以使用StandaloneDeriving
GHC语言扩展。泛型
如果类型有一个
Generic
示例,可以使用generic-deriving包中的gshowsPrecdefault
函数将其字符串化。GHCi:force
您可以在GHCi中使用
:force
命令来检查值。参见GHC手册中的 * 断点和检查变量 *。
zfciruhq2#
如果你想以任何方式打印它,你必须让你的数据类型成为
Show
的示例。如果你不想派生Show
,你可以自己实现它。flseospp3#
你完全可以打印没有
Show
示例的东西。7gyucuyw4#
我有很多带类型参数的深度函数,比如
n
(用于数字类型),但函数上没有Show n
约束。这个函数最终被类似Double
的东西调用。要查看值而不对函数及其所有依赖项添加Show约束,可以使用以下命令:
并像
forceTraceShowId @_ @Double
一样调用forceTraceShowId
或者,您可以在所需的行/函数处设置断点,并在运行时使用
:force x
显示变量x
的值