2012-08-24 16 views
11

Die folgende code gezeigt:Haskell: Unterdrückt Anführungszeichen um Strings, wenn

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

hello_world = "hello world" 

main = putStr $ show $ (HelloWorld, hello_world) 

Drucke:

(hello world,"hello world") 

ich es drucken möchten:

(hello world,hello world) 

dh ich Verhalten wollen wie folgt:

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

Leider show nicht erfüllt wird, wie:

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

Gibt es eine Funktion, die wie f arbeitet, die ich oben beschrieben habe?

+3

Es wird allgemein als gute Praxis angesehen, eine neue Typklasse (z. B. 'PPrint') für Übersetzungen zu erstellen zu menschenlesbaren 'String's. –

+0

@ Clinton hat eine dieser Antworten geholfen? –

Antwort

1

Ich glaube nicht, dass es ein Standard ist typeclass, die dies für Sie tun, aber man Abhilfe wäre eine newtype zu definieren:

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

Dann show (PlainString "hello world") == "hello world" und Sie show wie gewohnt mit anderen Typen verwenden können, .

13

Betrachten Sie zuerst this question. Vielleicht werden Sie mit toString Funktion zufrieden sein.

Zweitens ist show eine Funktion, die einen Wert auf eine String abbildet.

So ist es sinnvoll, die entkommen sei zitiert:

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

Gibt es eine Funktion, die wie f arbeitet, die ich oben beschrieben habe?

Scheint, wie Sie suchen id:

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

diese letzte Antwort zu vervollständigen, können Sie die folgende Klasse definieren:

{-# 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 ++ ")" 

und die Funktion f beschrieben wird das sein printString-Funktion

Verwandte Themen