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
как обычно с другими типами.