2016-10-27 13 views
1

だから私はこの仕事をしていますが、私は今のところ苦労しています。私は、2つの単語が同じ母音を持っているかどうかをチェックするプログラムを書くことになっています。それは署名だだ これを行うためにハスケルの単語の個々の文字列をチェックするにはどうすればよいですか?

vowelEq :: String -> String -> Bool 

、私はcharが母音であり、それに応じてブール値を返した場合、基本的にチェックvowelCheckと呼ばれる機能を、作りました。

vowelCheck :: Char -> Bool 
vowelCheck v | (v == 'a' || v == 'A') = True 
      | (v == 'e' || v == 'E') = True 
      | (v == 'i' || v == 'I') = True 
      | (v == 'o' || v == 'O') = True 
      | (v == 'u' || v == 'U') = True 
      | otherwise = False 

これまでのところ、それは私が持っているものです:

vowelEq :: String -> String -> Bool 
vowelEq s1 s2 | vowelCheck(head(s1)) == vowelCheck(head(s2)) = True 
       | otherwise = False 

をそれだけで単語(ヘッドS1)の最初の文字が母音であるかどうかを確認することができ、それは上と同じだ場合他の言葉。 ここに私の問題があります。残りの単語をチェックする方法はわかりません。私は尾を再帰的に使用する考えがありましたが、それはvowelEq(私は変更することは許されていませんが、あなたを気にします)の署名では機能しません。または、文字列の最初の要素を削除するだけで、大いに役立ちます。 これまでは、データ型を宣言する方法だけでなく、非常に基本的な関数を実行する方法も学んだので、たくさんのものはありません。

私は初心者ですから、クラスで最初にやったことですから、アドバイスや解決策を説明していただければ幸いです。

+2

は「私は、二つの単語が同じ母音を持っているかどうかをチェックするプログラムを書くことになっています。」それはどういう意味ですか?母音も同じですか?すべての母音は同じですか?同じ順序で同じ母音ですか? – Thilo

+2

これまでのところ、あなたの試みは、2つの弦が同じ位置に* a *母音を持っていることを確認する方向に向いています。同じ*母音ではありません。 – chepner

+0

@Thilo同じ順序の母音を意味します。私は混乱のために申し訳ありません。だから 'vowelEq apple angle'は' True'を返します。 @chepner Welp、そうだよ!それを考えなかったのです!私は今すぐ修正するという特別な考えは持っていませんが、 'vowelCheck'を変更して別の' Char'を返すようにして比較すると 'Char'は仕事をするべきでしょうか? – Readler

答えて

1

tail s1を使用すると、残りの文字列(空の場合があります)を取得できます。

これは、文字列が空になるまで、文字列がますます短くなるように再帰的に関数を呼び出すために使用します。

同じ順序の母音の同じセット。

これは、あなただけの母音を見てする必要があることを意味します:文字列は、非母音で始まる場合、あなたはちょうどそれを無視し、その文字列のためにtailを続行することができます。

私は再帰的に尾を使用するためのアイデアを持っていたが、それはvowelEq

なぜないの署名では動作しませんか? 2つの尾はまだ2つの弦です。

+0

はい!それはまさに私がやりたいことでしたが、テールは文字列ではなくリストを返すので、うまくいかないと思っていました。 – Readler

+2

@Readler: 'type String = [Char]' 'String'は文字のリストの別名です。 – chepner

+0

@chepnerさて、私は馬鹿だと感じます。だから私の例に戻って、 'vowelEq(tail s1)'を使うと毎回文字列を短くすることができますか?私はそれを自分で確認するだろうが、残念ながら私は現時点では道にいる。 – Readler

1

このような何かが動作するはずです:

isVowel c= or $ map (c==) ['a','A','e','E','i','I','o','O','U','u'] 
vowelEq a b = (filter isVowel a) == (filter isVowel b) 

とテストへ:

vowelEq "behind" "rewind" 
関連する問題