定义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等)。就我个人而言,我只有在我必须在我不得不(例如purescript-test-unit强制强制)的情况下写Show实例。

最新更新