为 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 中的 traceAnytraceAnyAspy 等)。就个人而言,我只在必须时才写 Show 个实例(例如 purescript-test-unit 强制)。