如何在 Haskell 中正确使用 toLower?

sch*_*ine 4 haskell

我最近开始学习 Haskell 并想将某些内容转换为小写。我查找了函数“toLower”,但它似乎不起作用。

Prelude> import Data.Text
Prelude Data.Text> toLower "JhELlo"

<interactive>:2:9: error:
    * Couldn't match expected type `Text' with actual type `[Char]'
    * In the first argument of `toLower', namely `"JhELlo"'
      In the expression: toLower "JhELlo"
      In an equation for `it': it = toLower "JhELlo"
Prelude Data.Text> toLower 'JhELlo'

<interactive>:3:9: error:
    * Syntax error on 'JhELlo'
      Perhaps you intended to use TemplateHaskell or TemplateHaskellQuotes
    * In the Template Haskell quotation 'JhELlo'
Prelude Data.Text>
Run Code Online (Sandbox Code Playgroud)

Bar*_*icz 9

它不起作用,因为您尝试使用的版本在 上运行Text,而不是在String. 这是两种截然不同的类型。此时您有两个选择:

1) 使用toLowerData.Char; 这个对单个字符进行操作,您可以将其映射到您的字符串上:

map toLower "JhELlo"
Run Code Online (Sandbox Code Playgroud)

2)将您的字符串转换为Data.Text(并可选择再次返回):

unpack . toLower . pack $ "JhELlo"
Run Code Online (Sandbox Code Playgroud)

其实还有其他版本的toLower;一个 inData.Sequences似乎是多态的(所以应该对两者都适用),但它可能需要将mono-traversable包作为依赖项引入。

  • 如果你有选择,`Data.Text.toLower` 应该优先于 `Data.Char.toLower`,因为它的行为在国际文本上更正确。例如,`Data.Text.toLower "İ" = "i\775"`(两个输出代码点!)而 `Data.Char.toLower "İ" = "i"` 只是一个近似值。 (2认同)