Haskell - 声明/使用数据

时间:2011-10-03 12:55:37

标签: haskell types

这是我第一次在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"

如果字符串同时包含元音和辅音或只有元音,如何改进代码以便它只适用于辅音,它现在有效吗?

3 个答案:

答案 0 :(得分:5)

这是作业,不是吗?

您的代码问题包括:

  1. 这条线毫无意义:

    cheak [] = ""
    

    因为cheak应该返回Consonant,但在这里您返回String

  2. 这条线也没有意义:

    cheak = Cons (seq:seqs) "Is Consonant"
    

    beacause cheak应该使用String参数并返回Consonant,但在这里您只需返回Consonant而不带任何参数。

    < / LI>
  3. 这条线的意义更小:

    else    cheak = Cons (seq:seqs) "Not Consonant"
    

    Haskell不是Pascal或Visual Basic。您可以通过让等式的RHS评估为该值来从函数返回值。

  4. 缩进很重要。

  5. 在Haskell中有一个名为break的函数,但它与您在Java或C中可能熟悉的break关键字无关.JP / C概念的突破Haskell中不存在循环。

  6. 您可能想要使用辅助函数。

  7. “Cheak”不是一个词。

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