現在我正在開發一個程式,該程式洗掉文本元素中除“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"which 作業正常,但后來我添加了 OverloadedStrings 這使它不起作用并給出了“模棱兩可的型別變數”錯誤訊息。我很困惑是什么導致elem` "a"停止作業,整個 Char -> Bool 是關于什么的,以及該怎么做。如果你能幫助我謝謝。
uj5u.com熱心網友回復:
通過檢查 filter 的型別簽名:filter :: (Char -> Bool) -> T.Text -> T.Text我們知道 filter 接受一個函式和一個 Text,該函式接受 Char 并回傳 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"
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/404599.html
標籤:
下一篇:在OCaml中派生實作
