Haskell:
字符串插值
How to: (如何操作:)
Haskell 中可以用多种方式插值字符串,但让我们看一个简单例子:使用 printf
函数。
import Text.Printf (printf)
name = "张三"
age = 28
main = printf "Hello, %s! You are %d years old.\n" name age
输出:
Hello, 张三! You are 28 years old.
Deep Dive (深入探究)
过去,Haskell 没有内建的字符串插值功能。printf
来自 C 语言家族,在 Haskell 中通过 Text.Printf
模块提供类似功能。还有其他库,比如 interpolate
和 string-interpolate
,它们使得插值更加方便。
例如,string-interpolate
库允许您这样写:
{-# LANGUAGE QuasiQuotes #-}
import Data.String.Interpolate (i)
name = "李四"
occupation = "程序员"
main = putStrLn [i|你好,#{name}! 你是一名#{occupation}.|]
QuasiQuotes
让 Haskell 支持自定义插值语法。上面的代码也需要添加包依赖和适当配置。
其他根本性的方法包括字符串连接或使用 ++
运算符拼接较简单的情况。例如:
main = putStrLn ("你好," ++ name ++ "! 你是一名" ++ occupation ++ ".")
这种方式相比插值来说,对于复杂字符串会变得笨拙且不易读。
实现细节上,使用插值函数通常涉及解析字符串并在运行时替换标记,这可能比纯粹的字符串连接稍微慢一点,但在正常使用情况下差别不大。
See Also (另请参阅)
- Haskell
Text.Printf
文档:https://hackage.haskell.org/package/base-4.16.1.0/docs/Text-Printf.html string-interpolate
库:https://hackage.haskell.org/package/string-interpolate- 关于
QuasiQuotes
的更多信息:https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/glasgow_exts.html#quasi-quotation