Haskell中如何设置GHC优先选择Text而非String类型?
让GHC默认将字符串字面量解析为Text类型
核心解决方案:结合OverloadedStrings扩展与默认类型声明
要让未限定类型的字符串字面量默认被解析为Text,只需两步操作:
开启
OverloadedStrings扩展
这个扩展会把字符串字面量(如"some text")转换为IsString类型类的实例,而Data.Text.Text和原生String都实现了这个类。声明默认类型为
Text
在模块开头添加default (Text),告诉GHC当类型无法自动推断时,优先选择Text而非String。
修改你提供的示例代码后,就不会再报错:
{-# LANGUAGE OverloadedStrings #-} import Data.Text default (Text) some = "some" -- 自动推断为Text类型 text1 = "text1" :: Text two = Data.Text.concat [some, text1] -- 正常编译
全局配置简化操作(项目级)
如果不想每个模块都重复写上述代码,可以通过项目配置文件全局开启OverloadedStrings:
- 若使用Stack,在
package.yaml的ghc-options中添加-XOverloadedStrings - 若使用Cabal,在
.cabal文件的executable或library部分的ghc-options中加入-XOverloadedStrings
之后只需在项目的公共基础模块中添加default (Text),其他模块导入该基础模块即可统一生效。
注意事项
- 若某些场景确实需要原生
String,只需显式添加类型注解(如"some" :: String)即可 - 确保你的项目中已经依赖了
text包(通常在package.yaml或.cabal的build-depends中添加text >= 1.2)
内容的提问来源于stack exchange,提问作者user855443
相关产品推荐
相关产品推荐

