哈斯克尔:显示搞砸了?

Luc*_*cky 8 api haskell

Haskell中的show函数似乎没有做它应该做的事情:

Prelude> let str = "stack\n\noverflow"
Prelude> putStrLn str
stack


overflow
Prelude> show str
"\"Stack\\n\\n\\noverflow\""
Prelude>
Run Code Online (Sandbox Code Playgroud)

当我声明函数时,我通常将类型签名设置为Show,它不能正确处理换行符.我希望它\n作为换行符,而不是字面意思"\n".当我将类型更改为String时,函数可以正常工作.但是我必须为整数,浮点数等实现一个单独的函数.

例如,我可以声明一个函数:

foo :: (Show x) => x -> IO ()
foo x = do
  putStrLn $ show x
Run Code Online (Sandbox Code Playgroud)

......并以这种方式称呼它:

foo "stack\n\noverflow"
foo 6
foo [1..]
Run Code Online (Sandbox Code Playgroud)

如何让函数返回预期的函数?即哪个函数类似show但可以返回包含换行符的字符串?

Dav*_*ave 15

Haskell中show方法的契约是它生成一个字符串,在计算时,它会产生显示的值.

Prelude> let str = "stack\n\noverflow"
Prelude> putStrLn str
stack

overflow
Prelude> putStrLn (show str)
"stack\n\noverflow"
Prelude> 
Run Code Online (Sandbox Code Playgroud)

  • 只是为了补充一点,你描述的函数被称为"print",它实际上被定义为上面的print x = putStrLn(show x) (2认同)

por*_*ges 9

听起来你正试图模拟一个ToString方法,虽然你的一些术语有点令人困惑.

你可以像这样模拟它:

{-# LANGUAGE UndecidableInstances, OverlappingInstances,
             FlexibleInstances, TypeSynonymInstances #-}

class ToString a where
    toString :: a -> String

instance ToString String where
    toString = id

instance Show a => ToString a where
    toString = show
Run Code Online (Sandbox Code Playgroud)

但是,如LANGUAGE编译指示所示,这不是很理想.要真正了解你想要做的事情,如果我们有更多的背景会更容易...