我能';似乎没有在haskell中设置字符的值?

我能';似乎没有在haskell中设置字符的值?,haskell,char,Haskell,Char,我正在学习haskell,理解它有点困难。基本上,我有一个程序,可以读入一个字母,如果它是辅音,就把它改成“!”,但是,我似乎无法设置角色的值 这是我到目前为止的代码 isConsonant :: Char -> Bool consonant_alphabet = ['b'..'d']++['f'..'h']++['j'..'n']++['p'..'t']++['v'..'z'] ++ ['B'..'D']++['F'..'H']++['J'..'N']++['P'..'T']++['V'

我正在学习haskell,理解它有点困难。基本上,我有一个程序,可以读入一个字母,如果它是辅音,就把它改成“!”,但是,我似乎无法设置角色的值

这是我到目前为止的代码

isConsonant :: Char -> Bool
consonant_alphabet = ['b'..'d']++['f'..'h']++['j'..'n']++['p'..'t']++['v'..'z'] ++ ['B'..'D']++['F'..'H']++['J'..'N']++['P'..'T']++['V'..'Z']
isConsonant character = character `elem` consonant_alphabet

repConsonant :: Char -> String
repConsonant c =
    if isConsonant c
        then "CONVERT IT TO !"
        else do "NO CONVERSION REQUIRED"
出于调试目的,我将其作为字符串输出,但我无法理解这一点。。有什么想法吗?我已经试过了

let c = "!"

尝试在ghci中输入辅音“a”


而且,
do
是冗余的。只需使用
或“无需转换”

想想你想要进行的转换,并将其与你想要进行的转换次数分开。repConsonant应该是Char->Char

repConsonant :: Char -> Char
repConsonant c =
 if isConsonant c
    then '!'
    else c
现在repConsonant应该对一个字符执行您想要的操作,您所需要做的就是将它应用于字符串中的每个字符

我似乎无法设置角色的值

是,您只能为名称分配一次值。这是故意的。它应该引导您的程序设计到更小的函数,这些函数将输入转换为输出编程风格。如果需要在函数中构建值,则需要“let-in”或“where”语法


双引号用于字符串,单引号用于单个字符。
let addone a = let b = 1 in a + b
let addtwo a = a + b
  where b = 2