haskell - Haskell:无法将类型“Char”与“[Char]”匹配
问题描述
我是 Haskell 的新手,我正在尝试创建一个简单的函数来操作类似于toLower
,toUpper
和switchCase
其他语言的字符串。但是,每当我尝试传递isUpper
或isLower
进入模板函数时,它都会向我抛出这个错误。
* Couldn't match type `Char' with `[Char]'
Expected: [Char] -> Bool
Actual: Char -> Bool
* In the second argument of `lambdaTextConv', namely `isLower'
In the expression: lambdaTextConv str isLower
In an equation for `toLower':
toLower str = lambdaTextConv str isLower
|
53 | toLower str = lambdaTextConv str isLower
| ^^^^^^^
Failed, no modules loaded.
代码本身是一个简单的函数,它接受一个字符串,并在适当的时候切换大小写。
import System.IO
import Data.List
import Data.Maybe
letters = take 26 (zip ['A'..] ['a'..])
upperLetters = ['A'..'Z']
lowerLetters = ['a'..'z']
lambdaTextConv str ltrFnc =
[
lambdaNewLetter x ltrFnc
| x <- str ]
lambdaNewLetter x ltrFnc =
if (ltrFnc x)
then x
else ((switchCase x:[]) !! 0)
isUpper char = char `elemIndex` upperLetters /= Nothing
isLower char = char `elemIndex` lowerLetters /= Nothing
toUpper str = lambdaTextConv str isUpper
toLower str = lambdaTextConv str isLower
switchCase str =
[
if (isUpper x)
then snd(letters !! fromJust(x `elemIndex` upperLetters))
else fst(letters !! fromJust(x `elemIndex` lowerLetters))
| x <- str ]
解决方案
结果证明解决方案非常简单。GHC 编译器推断它lambdaTextConv
是类型[Char] -> ([Char] -> Bool) -> [Char]
,因为该行
else ((switchCase x:[]) !! 0)
应该是什么时候
else ((switchCase (x:[])) !! 0)
源现在看起来更像这样(省略了导入)
letters = take 26 (zip ['A'..] ['a'..])
upperLetters = ['A'..'Z']
lowerLetters = ['a'..'z']
lambdaTextConv :: [Char] -> (Char -> Bool) -> String
lambdaTextConv str ltrFnc =
[
lambdaNewLetter x ltrFnc
| x <- str ]
lambdaNewLetter :: Char -> (Char -> Bool) -> Char
lambdaNewLetter x ltrFnc =
if (ltrFnc x)
then x
else ((switchCase (x:[])) !! 0)
isUpper char = char `elemIndex` upperLetters /= Nothing
isLower char = char `elemIndex` lowerLetters /= Nothing
toUpper str = lambdaTextConv str isUpper
toLower str = lambdaTextConv str isLower
switchCase str =
[
if (isUpper x)
then snd(letters !! fromJust(x `elemIndex` upperLetters))
else fst(letters !! fromJust(x `elemIndex` lowerLetters))
| x <- str ]
推荐阅读
- python - 使用 Python 使用 jaydebeapi 连接 MYSQL DB
- javascript - ZeroMQ + NodeJs:订阅者未收到消息
- maven - 如何使用声纳扫描多模块 Maven 项目?
- java - 查找乘积小于给定整数 k 的子数组的数量
- arrays - 我需要使用 useContext 和 map 函数更新 React 中的数组状态
- amazon-web-services - AWS s3 私有存储桶创建
- javascript - 为什么 jQuery append 不会下推内容?
- flutter - 是否可以在 Flutter 中添加自定义 wrap 小部件菜单?
- powershell - 在 Powershell 输出中加入每两行
- express - 在 Google Cloud Function 上使用 Express App 的优势