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ある値を にマップする関数です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

これを行う標準の型クラスがあるとは思いませんが、1 つの回避策は newtype を定義することです。

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 に答える