2012-08-24 65 views
11

禁止字串,報價以下code哈斯克爾:當顯示

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的功能?

+3

爲翻譯創建一個新的類型類(例如名爲'PPrint')轉換爲可讀的字符串。 –

+0

@Clinton做了這些答案有幫助嗎? –

回答

1

我不相信有一個標準類型類會爲你做到這一點,但一個解決方法是定義一個NEWTYPE:

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

然後show (PlainString "hello world") == "hello world",你可以使用show正常與其他類型。

13

首先,看看this question。也許你會滿意toString函數。

其次,show是一個將某些值映射到String的函數。

因此,它是有道理的,報價應進行轉義:

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

是否有類似的作品,我已經上述f的功能?

好像你正在尋找id

> putStrLn $ id "string" 
string 
> putStrLn $ show "string" 
"string" 
3

要完成這最後的答案,你可以定義以下類:

{-# 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函數