嗨,我正在嘗試過濾一個字串,因此它只輸出其中的字母。
這是我到目前為止
filteredText :: String -> String
filteredText (x:xs) = filter (\toLower x -> x `elem` ['a'..'z']) xs
并給我這個錯誤:
Couldn't match expected type ‘Bool’
with actual type ‘Char -> Bool’
uj5u.com熱心網友回復:
我相信你想要的是filteredText xs = filter (\x -> (toLower x) `elem` ['a'..'z'])。
\和之間->是匿名函式的正式引數。你有\toLower x ->...,意思是兩個引數,其中一個是預期的:
filter :: (a -> Bool) -> [a] -> [a] -- takes f :: (a -> Bool), as :: [a], gives [a]
f 只接受一個引數。
此外,filteredText (x:xs)模式匹配 x 作為串列的頭部(第一個元素)和 xs 尾部(串列的其余部分,但頭部除外)。因此,第一個元素被忽略了。我以為不是故意的。
uj5u.com熱心網友回復:
的第一個引數filter應該是一個函式,當呼叫一個元素時,它決定我們是否希望將該元素保留在結果中。因此,這是一個函式,對于給定的x將回傳Trueor False,因此具有 as 形狀\x -> …。
另一個問題是您匹配(x:xs)模式。這意味著您的運算式將省略串列的第一項,而只會處理串列的尾部。此外,這意味著傳遞空字串會引發錯誤。因此可以將整個串列命名為xs:
filteredText :: String -> String
filteredText xs = filter (\x -> …) xs
因此,您需要在這里實作…運算式:您首先使用toLower獲取給定字符的小寫變體,然后您可以使用`elem` ['a' .. 'z']來檢查 的小寫是否x屬于該串列。我將實作作為練習。
uj5u.com熱心網友回復:
你可以得到一些非常接近你寫的東西,用
> filter ( \ (toLower -> x) -> x `elem` ['a'..'z'] ) "1243sdfwerweKJHKJ(*&@*#9798"
=> "sdfwerweKJHKJ"
您需要為此啟用 ViewPatterns。GHCi 命令是:set -XViewPatterns.
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/326051.html
標籤:哈斯克尔
