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)
听起来你正试图模拟一个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编译指示所示,这不是很理想.要真正了解你想要做的事情,如果我们有更多的背景会更容易...
| 归档时间: |
|
| 查看次数: |
4783 次 |
| 最近记录: |