26

以下代码

data HelloWorld = HelloWorld; 
instance Show HelloWorld where show _ = "hello world";

hello_world = "hello world"

main = putStr $ show $ (HelloWorld, hello_world)

印刷:

(hello world,"hello world")

我想打印:

(hello world,hello world)

即我想要如下行为:

f "hello world" = "hello world"
f HelloWorld = "hello world"

不幸的是,show不能满足这一点,因为:

show "hello world" = "\"hello world\""

有没有像f我上面描述的那样工作的功能?

4

3 回答 3

24

首先,看一下这个问题。也许你会对功能感到满意toString

其次,show是一个将一些值映射到 a 的函数String

因此,应该转义引号是有道理的:

> show "string"
"\"string\""

有没有像f我上面描述的那样工作的功能?

好像您正在寻找id

> putStrLn $ id "string"
string
> putStrLn $ show "string"
"string"
于 2012-08-24T07:01:27.887 回答
4

要完成最后一个答案,您可以定义以下类:

{-# LANGUAGE TypeSynonymInstances #-}

class PrintString a where
  printString :: a -> String

instance PrintString String where
   printString = id

instance PrintString HelloWorld where
   printString = show

instance (PrintString a, PrintString b) => PrintString (a,b) where
   printString (a,b) = "(" ++ printString a ++ "," ++ printString b ++ ")"

并且所描述的函数 f 将是 printString 函数

于 2012-08-24T08:14:55.247 回答
1

我不相信有一个标准的类型类可以为你做这件事,但一种解决方法是定义一个新类型:

newtype PlainString = PlainString String
instance Show PlainString where
  show (PlainString s) = s

然后show (PlainString "hello world") == "hello world",您可以show正常使用其他类型。

于 2012-08-24T03:51:27.160 回答