定义 ADT 的显示实例

gui*_*ido 2 purescript

我尝试为 ADT 定义一个 show 实例,但收到错误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"
Run Code Online (Sandbox Code Playgroud)

pal*_*luh 5

您必须将构造函数的参数放在括号中。尝试这样的事情:

instance showRoute :: Show Route where
  show Home = "Home"
  show (Users str) = "Users"
  show (User i) = "User"
  show (NotFound str) = "404"
Run Code Online (Sandbox Code Playgroud)

Show相关附注:

您还可以Show使用 派生此类简单类型的实例purescript-generic-reps,但必须首先派生实例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
Run Code Online (Sandbox Code Playgroud)

我制作了简单的代码片段,以便您可以在try.purescript.org上使用它

甚至可以混合使用这两种方法:

instance showRoute :: Show Route where
  show (Users u) = "CusomUsersShow " <> u
  show u = genericShow u
Run Code Online (Sandbox Code Playgroud)

出于调试目的,您始终可以使用来自 的traceAny( traceAnyAspy等) purescript-debug。就我个人而言,我Show仅在必要时才编写实例(例如被迫purescript-test-unit)。