Char -> Bool 过滤函数中的问题

Char -> Bool problems in filter function

现在我正在开发一个程序,该程序删除文本元素中除“a”以外的所有内容,作为练习题,这是我的代码。

{-# LANGUAGE OverloadedStrings #-}

import qualified Data.Char as C
import qualified Data.Text as T

removeNonAs :: T.Text -> T.Text
removeNonAs txt = T.filter ("a") txt

我的问题是 T.Filter 中的占位符“a”。每次我尝试 运行 程序时,它都会给出一条错误消息,指出 (class) 不是 Char -> Bool。我曾经使用 elem` "a" 效果很好,但后来我添加了 OverloadedStrings 这使得它不起作用并给出“模糊类型变量”错误消息。我对 elem` "a" 停止工作的原因、整个 Char -> Bool 的含义以及该怎么做感到非常困惑。如果你能帮助我谢谢。

通过检查过滤器的类型签名:filter :: (Char -> Bool) -> T.Text -> T.Text 我们知道过滤器接受一个函数和一个文本,该函数接受 Char 和 returns Bool 那么我们可以这样定义 removeNonAs:

import qualified Data.Char as C
import qualified Data.Text as T

removeNonAs :: String -> T.Text
removeNonAs = T.filter (=='a') . T.pack
-- usage:
removeNonAs "abcabcabc"
"aaa"

T.pack 将字符串转换为文本。

您还可以定义更通用的 removeNonAs 形式:

removeNonAsGeneral :: Char -> String -> T.Text
removeNonAsGeneral a = T.filter (==a) . T.pack
-- usage:
removeNonAsGeneral 'a' "abcdabcdabcd"
"aaa"