2011-10-03 61 views
1

這是我第一次在Haskell中使用數據類型。 有問題,我不知道如何改進代碼。Haskell - 聲明/使用數據

這裏的問題是:

Declear稱爲「聲母」,其中包括一些字母(字符串)數據類型,並得到了有關如果在字中的所有字母都是輔音與否的信息的textstring(串),然後編寫一個函數「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" 

它現在如果字符串有兩個元音輔音和或僅元音,如何提高代碼,以便它也只有輔音的作品?

回答

1

我不完全確定你在問什麼。在返回的Cons中的Word應該是Word傳遞給cheak還是Word的其餘部分從第一個元音開始?

這是做你想做的嗎?

module Consonant 
    where 

import Data.Char 

type Word = String 
type ConOrNot = String 
data Consonant = Cons Word ConOrNot 
       deriving (Show,Eq) 

cheak :: Word -> Consonant 
cheak "" = Cons "" "" 
cheak s = Cons s $ if any isVowel s then "Not Consonant" else "is Consonant" 
      where isVowel c = (toUpper c) `elem` "AEIOU" 
+0

這正是我想要的。感謝您的幫助。 – Ferry

5

這是功課,不是嗎?

與您的代碼的問題包括:

  1. 此行是沒有意義的:

    cheak [] = "" 
    

    因爲cheak應該返回一個Consonant,但在這裏你返回String

  2. 此行也沒有任何意義:

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

    東陽cheak應該採取String參數和返回Consonant,但在這裏你只返回一個Consonant沒有采取任何參數。

  3. 這條線,使更少的感覺:

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

    Haskell是不是帕斯卡或Visual Basic。通過讓方程的RHS評估爲該值,您可以從函數中返回一個值。

  4. 縮進問題。

  5. 有一個叫break在Haskell功能,但它是毫無關係的break關鍵字,你可能熟悉的Java或打破了一個循環的Haskell中不存在C的的Java/C概念。

  6. 您可能想要使用助手功能。

  7. 「Che is」不是一個字。

  8. if - then - else不是一個聲明。 then-branch和else-branch也不是語句。他們都是表達。這就像來自Java,C和其他一些語言的?: