【问题标题】:Output haskell object omitting 'show' declarations输出haskell对象省略'show'声明
【发布时间】:2018-04-18 19:54:10
【问题描述】:

如何将 Haskell 对象作为有效 Haskell 代码的字符串输出到省略现有 show 声明的输出?

例如,我有以下类型声明和对应的show 声明(check the code out in an online IDE):

{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-}

import Data.Maybe

type VersionCompound = Maybe Int

data VersionNumber = VersionNumber [VersionCompound] deriving (Show)

data MaturityLevel = Dev
                   | Test
                   | User
                   | ReleaseCandidate
                   | Prod
                   deriving (Show)

data Version = MaturityVersion MaturityLevel VersionNumber  
     | Version VersionNumber

class ToString a where
    toString :: a -> String

instance ToString VersionCompound where
    toString (Just n) = (show n)
    toString Nothing = "x"

instance ToString [VersionCompound] where
    toString [] = "" 
    toString (x:[]) = (toString x)
    toString (x:xs) = (toString x) ++ "." ++ (toString xs) 

instance ToString VersionNumber where
    toString (VersionNumber []) = "" 
    toString (VersionNumber (x:[])) = (toString x) 
    toString (VersionNumber (x:xs)) = (toString x) ++ "." ++ (toString xs)

instance ToString Version where
    toString (MaturityVersion maturityLevel versionNumber) = (show maturityLevel) ++ "/" ++ (toString versionNumber)
    toString (Version versionNumber) = (toString versionNumber)

instance Show Version where
    show version = toString version

main = putStrLn $ show (Version $ VersionNumber [ Just 1, Just 2, Nothing])

这个程序的输出是:

1.2.x

但是有没有办法以有效的 Haskell 代码的形式输出对象?例如,showIntact $ Version $ VersionNumber [ Just 1, Just 2, Nothing] 上面的代码会输出如下内容:

Version ( VersionNumber [ Just 1, Just 2, Nothing] )

【问题讨论】:

  • deriving (Show) 添加到您的数据声明中。不要覆盖Show。为非标准的showing 编写另一个函数versionNumber :: Version -> String
  • 如果您将deriving Show 添加到Version 类型,print $ Version $ VersionNumber [ Just 1, Just 2, Nothing] 应该可以工作,就像您为其他人所做的那样。
  • @chi:在这种情况下它抱怨Duplicate instance declarations
  • 糟糕,我没有看到最后一个 Show Version 实例。您是否有任何理由要保留该实例而不是默认实例?
  • 我只是认为我确实不需要保留Show Version 实例。这解决了我将对象“导出”为 Haskell 表示的问题。

标签: haskell io


【解决方案1】:

您可以定义自己的函数:

showIntact :: Version -> String
showIntact (Version v) = "Version " ++ show v
showIntact (MaturityVersion ml vn) = "MaturityVersion " ++ show ml ++ " " ++ show vn

然后您可以使用putStrLn $ showIntact $ ....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-29
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多