为 ADT 定义显示实例
Define show instance for ADT
我试图为 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
等)。就个人而言,我只在必须时才写 Show
个实例(例如 purescript-test-unit
强制)。
我试图为 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
等)。就个人而言,我只在必须时才写 Show
个实例(例如 purescript-test-unit
强制)。