这是我第一次在Haskell中使用数据类型。 遇到问题,我不知道如何改进代码。
问题在于:
清除一个名为“辅音”的数据类型,其中包含一些字母(字符串),以及一个文本字符串,它获取有关该字母中所有字母是否为辅音(字符串)的信息,然后编写一个函数“Cheak”,其中得到indata(一些写信给cheak)和outdata(数据类型为“Consonant”)。
这是我的代码:
module Consonant where
import Char
type Name = String
type ConOrNot = String
data Consonant = Cons Name ConOrNot
deriving (Show,Eq)
isVowel = "AEIOU"
cheak :: String -> Consonant
cheak [] = ""
cheak (char:chars) =
if elem (toUpper char) isVowel == false
then cheak chars
else cheak = Cons (char:chars) "Not Consonant"
-- here I want to use "break", but I don't know how to use it in Haskell...
cheak = Cons (char:chars) "Is Consonant"
它不起作用......如何更改代码?请帮忙!谢谢!
更新
module Consonant where
import Char
type Word = String
type ConOrNot = String
data Consonant = Cons Word ConOrNot
deriving (Show,Eq)
isConsonant = "BCDFGHJKLMNPQRSTVWXYZ"
cheak :: String -> Consonant
cheak [] = Cons "" ""
cheak (char:chars)
|elem (toUpper char) isCosonant = cheak chars --if all the letters are cosonant, I want it return (Cons (char:chars) "is Consonant").. still working on it
|otherwise = Cons (char:chars) "Not Consonant"
如果字符串同时包含元音和辅音或只有元音,如何改进代码以便它只适用于辅音,它现在有效吗?
答案 0 :(得分:5)
这是作业,不是吗?
您的代码问题包括:
这条线毫无意义:
cheak [] = ""
因为cheak
应该返回Consonant
,但在这里您返回String
。
这条线也没有意义:
cheak = Cons (seq:seqs) "Is Consonant"
beacause cheak
应该使用String
参数并返回Consonant
,但在这里您只需返回Consonant
而不带任何参数。
这条线的意义更小:
else cheak = Cons (seq:seqs) "Not Consonant"
Haskell不是Pascal或Visual Basic。您可以通过让等式的RHS评估为该值来从函数返回值。
缩进很重要。
在Haskell中有一个名为break
的函数,但它与您在Java或C中可能熟悉的break
关键字无关.JP / C概念的突破Haskell中不存在循环。
您可能想要使用辅助函数。
“Cheak”不是一个词。
if
- then
- else
不是声明。 then-branch和else-branch也不是语句。他们都是表达方式。它就像来自Java,C和其他一些语言的?:
。
答案 1 :(得分:1)
我不完全确定你要求的是什么。返回的Word
中的Cons
应该是传递给Word
的{{1}}还是从第一个元音开始的cheak
的其余部分?
这样做你想要的吗?
Word
答案 2 :(得分:0)
在Haskell中有很多方法可以做你想做的事情。明显的首选是Maybe和Either。但一般来说,请查看8 ways to report errors in Haskell 。