我即将开始在 Haskell 中开发一个需要一些 Unicode 支持的应用程序。
如何在 Haskell 中执行 Unicode 模式匹配?我看到了GHC 的语法扩展。但是是否有任何语言级别的支持来执行此操作(不需要 GHC 的特殊扩展)?
我看到了这个问题,但那里给出的答案使用了基于扩展的方法。还有什么是最好的使用 Unicode 的 Haskell 库?字节串还是文本?两者的优点和缺点是什么?
据我所知,Unicode 字符的模式匹配是开箱即用的。尝试这个:
f ('薬':rest) = rest
f _ = "Your string doesn't begin with 薬"
main = do
putStrLn (f "薬は絶対飲まへん!")
putStrLn (f "なぜ?死にたいのか?")
关于库,您肯定需要 Text 而不是 ByteString,原因是 Text 实际上是用于处理文本,按字符而不是按字节计算字符串的长度等等,而 ByteString 只是一个不可变的字节数组,带有一些多余的装饰,更适合存储和传输二进制数据。
至于 ByteString、Text 等的模式匹配,没有扩展是不可能的,因为它们是具有故意隐藏实现的不透明类型。但是,您可以使用对 Text/ByteString 进行操作的许多高阶函数对字符进行模式匹配:
import Data.Text as T
countTs n 't' = n+1
countTs n 'T' = n+1
countTs n _ = n
main = do
putStr "Please enter some text> "
str <- T.pack `fmap` getLine
let ts = T.foldl countTs 0 str
putStrLn ("Your text contains " ++ show ts ++ " letters t!")
如果我是你,我不会担心使用扩展。GHC 只是Haskell 编译器,因此您不太可能需要使用其他任何东西来编译您的代码。