Show a
可以转换为String
show
。是否可以直接从Show a
转换为Text
而无需经过String
?
我了解到最佳做法是尽可能避免String
。但是Show a
类型类似乎很常见,String
对我来说太难以避免了?
还有一个类型类,类似于TextShow
,这样派生自TextShow
会自动获得textShow :: TextShow a => a -> Text
吗?
答案 0 :(得分:2)
好String
是一个类型为android.os.Handler的函数,这意味着程序可以构造任何生成Text
的函数。我们不能自动(使用编译器)“专门化”所有函数,以便它立即返回showText
,尽管Haskell编译器可以进行一些优化。
然而,我们可以构建我们自己的import Data.Text(Text, pack)
showText :: Show a => a -> Text
showText = pack . show
函数:
Show
这适用于所有pack
类型,因此Text
可用于ShowText
。
然而,有时候程序员可能优化 Text
(例如返回pack
常量通常比使用Show
更好。我们可以使用{-# LANGUAGE DefaultSignatures #-}
import Data.Text(Text, pack)
class ShowText a where
showText :: a -> Text
default showText :: Show a => a -> Text
showText = pack . show
的默认实现来定义类型类:
ShowText
因此,如果我们创建一个Show
的实例并且类型是DATEONLY
类型,那么如果我们实现一个特定的函数,那么将使用该函数,如果我们不这样做,那么将使用默认的“后备”实现。