2011-10-03 12 views
1

Haskellでデータ型を使用するのは初めてのことです。 問題が発生し、コードを改善する方法がわかりません。ここでHaskell - データの宣言/使用

は問題です:

Declear一部の文字(文字列)を含め、「子音」と呼ばれるデータ型、およびその単語のすべての文字が子音であるか、ない場合についての情報を得ましたtextstring(文字列)、その後、「チーク」(チアークにいくつかの文字)と「アウトデータ」(データタイプ「子音」)を持つ関数「チーク」を書いてください。ここで

が私のコードです:

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" 

これは、コードを変更する方法...動作しませんか? Plsヘルプ!ありがとうございました!

更新:

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

あなたが求めていることは完全にはわかりません。返されたConsWordは、cheakに渡されたWord、または最初の母音から始まる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

0

ハスケルでやりたいことを実行する方法はたくさんあります。明白な最初の選択肢は、MaybeとEitherです。しかし、一般的には、8 ways to report errors in Haskellをチェックアウトしてください。

5

これは宿題ですね。あなたのコードで

の問題は、次のとおりです。cheakConsonant返すことになっている

cheak [] = "" 

ので、しかし、ここであなたはStringを返す:

  1. この行は意味がありません。

  2. このラインも意味をなさない:cheak beacause

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

    Stringパラメータを取り、Consonantを返すことになって、しかし、ここであなただけの任意のパラメータを取ることなくConsonantを返しています。

  3. この線はさらに少ない理にかなって:

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

    HaskellはパスカルまたはVisual Basicではありません。方程式のRHSをその値に評価することによって、関数から値を返します。

  4. インデントの問題。

  5. 機能がありますがHaskellではbreakと呼ばれ、それはあなたがJavaやCからループを抜け出しザのJava/Cのコンセプトは、Haskellで存在していないに精通しているかもしれbreakキーワードとは無関係です。

  6. おそらくヘルパー機能を使用したいと思うかもしれません。

  7. "Cheak"は単語ではありません。

  8. if - then - elseは声明ではありません。 then-branchとelse-branchはどちらもステートメントではありません。彼らはすべての表現です。 Java、Cなどの他の言語の?:のようです。

関連する問題