Haskell: подавлять цитаты вокруг строк, когда показано

Следующий код:

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, описанная выше?

Ответ 1

Во-первых, посмотрите этот вопрос. Возможно, вы останетесь довольны функцией toString.

Во-вторых, show - это функция, которая отображает некоторое значение в String.

Итак, имеет смысл, что кавычки должны быть экранированы:

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

Есть ли функция, которая работает как f, которую я описал выше?

Похоже, вы ищете id:

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

Ответ 2

Чтобы завершить этот последний ответ, вы можете определить следующий класс:

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

Ответ 3

Я не верю, что есть стандартный класс, который сделает это для вас, но одним из способов было бы определить новый тип:

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

Затем show (PlainString "hello world") == "hello world", и вы можете использовать show как обычно с другими типами.