4

我正在学习 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 = "!"
4

2 回答 2

6

考虑一下您想要单独进行的转换,以及您想要进行多少次。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
于 2013-10-11T13:38:28.580 回答
1

尝试输入repConsonant 'a'ghci。

另外,do是多余的。只是else "NO CONVERSION REQUIRED"代替使用。

于 2013-10-11T13:34:28.913 回答