我试图为ADT定义一个显示实例,但我会收到错误Argument list lengths differ in declaration show
。如何在不使用Generic
的情况下进行此工作?
data Route = Home | Users String | User Int | NotFound String
instance showRoute :: Show Route where
show Home = "Home"
show Users str = "Users"
show User i = "User"
show NotFound str = "404"
您必须用括号中的参数包装构造函数。尝试这样的事情:
instance showRoute :: Show Route where
show Home = "Home"
show (Users str) = "Users"
show (User i) = "User"
show (NotFound str) = "404"
Show
相关侧面注:
您还可以使用purescript-generic-reps
来派生Show
实例,但是您必须先推导Generic
的实例:
import Data.Generic.Rep (class Generic)
import Data.Show.Generic (genericShow)
data Route = Home | Users String | User Int | NotFound String
derive instance genericRoute :: Generic Route _
instance showRoute :: Show Route where
show = genericShow
我已经制作了简单的片段,因此您可以在try.purescript.org
上玩它甚至可以混合这两种方法:
instance showRoute :: Show Route where
show (Users u) = "CusomUsersShow " <> u
show u = genericShow u
出于调试目的,您可以始终使用purescript-debug
使用traceAny
(traceAnyA
,spy
等)。就我个人而言,我只有在我必须在我不得不(例如purescript-test-unit
强制强制)的情况下写Show
实例。