简体   繁体   English

Haskell:无法将类型“Char”与“[Char]”匹配

[英]Haskell: Couldn't match type `Char' with `[Char]'

I'm new to Haskell and I'm trying to create a simple function that manipulates a string similar to toLower , toUpper , and switchCase in other languages.我是 Haskell 的新手,我正在尝试创建一个简单的 function 来操作类似于其他语言的toLowertoUpperswitchCase的字符串。 However, whenever I try to pass isUpper or isLower into the template function, it throws at me this error.但是,每当我尝试将isUpperisLower传递到模板 function 时,它都会向我抛出此错误。

* 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.

The code itself is a simple function that takes a string, and switches cases whenever appropriate.代码本身是一个简单的 function,它接受一个字符串,并在适当的时候切换大小写。

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 ]

The solution turned out to be really simple.结果证明解决方案非常简单。 The GHC compiler inferred that lambdaTextConv was of type [Char] -> ([Char] -> Bool) -> [Char] because of the line GHC 编译器推断lambdaTextConv的类型为[Char] -> ([Char] -> Bool) -> [Char]因为该行

    else ((switchCase x:[]) !! 0)

when it should have been应该在什么时候

    else ((switchCase (x:[])) !! 0)

The source now looks more like this (imports omitted)来源现在看起来更像这样(省略导入)

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 ]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM