Text.Printf与Data.Text?

Ski*_*gys 17 haskell

Data.Text在打印出来进行调试之前我一直在解压缩实例,并且认为只是用Text.Printf它.不幸的是,我无法让它发挥作用:

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
import Data.Text
import Text.Printf

--instance PrintfArg Text where
--  toUPrintf = toUPrintf . unpack

main :: IO ()
main = do
  let input :: Text = "abc"
  printf "Input: %s\n" input
Run Code Online (Sandbox Code Playgroud)

错误:

src/Main.hs:12:3:
    No instance for (PrintfArg Text)
      arising from a use of `printf'
    Possible fix: add an instance declaration for (PrintfArg Text)
    In a stmt of a 'do' block: printf "Input: %s" input
    In the expression:
      do { let input :: Text = "abc";
           printf "Input: %s" input }
    In an equation for `main':
        main
          = do { let input :: Text = ...;
                 printf "Input: %s" input }
Run Code Online (Sandbox Code Playgroud)

取消注释实例声明后:

src/Main.hs:7:7:
    `toUPrintf' is not a (visible) method of class `PrintfArg'
src/Main.hs:7:19: Not in scope: `toUPrintf'
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

EDITED

正如所建议的,试过TH,仍然没有去:

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TemplateHaskell #-}
import Data.Text
import Language.Haskell.TH
import Text.Printf

runQ [d| instance PrintfArg Text where toUPrintf = toUPrintf . unpack|]

main :: IO ()
main = do
  let input :: Text = "abc"
  printf "Input: %s\n" input
Run Code Online (Sandbox Code Playgroud)

错误:

src/Main.hs:9:40:
    'toUPrintf' is not a (visible) method of class 'PrintfArg'
src/Main.hs:9:52: Not in scope: 'toUPrintf'
Run Code Online (Sandbox Code Playgroud)

救命!令人惊讶的是,根据默认情况下使用Data.Text的所有建议,这不是开箱即用的.

rei*_*erp 13

警告:文本格式未维护,作者在2年内没有回复.看到其他答案.


我会看一下文本格式包:它类似于Text.Printf,但是专门设计用于Data.Text.Lazy.

文本格式还有一些其他优点Text.Printf:

  • Buildable班是暴露的,所以它可以扩展以支持新的参数类型.
  • 它使用可变参数,以一种更简单的方法,它回避了一个有问题Text.Printf访问返回值.
  • 它应该快得多,原因有以下几点:
    • 它永远不会转化为低效的String表现形式;
    • 它不构建中间数据类型,不像UPrintfText.Printf;
    • 它采用了双转换包渲染DoubleFloat,这是大约快30倍比前奏的方法.

  • 你如何用它来做像`%.02f`这样的经典printf格式化的东西? (9认同)