2017-09-01 7 views
0

私はHaskellを初めて使い、現在学校で学んでいます。私は特定のパターンを含むメッセージをデコードする必要がある学校の仕事を持っていますが、これをどうやって行うのか分かりません。Haskell - パターン付きメッセージのデコード

文字の後に子音があり、その後に同じ子音が後に続く場合、その部分文字列( "XoX"はXが子音)を置き換える必要があります。子音だけでたとえば、文字列 "hohejoj"をデコードすると "hej"が返されます。私がこれをうまく説明していれば申し訳ありませんが、私はあなたが理解していると思います。

これは私がこれまで持っている(しかし、それは動作しません)コードです:¨

karpsravor :: String->String 
karpsravor s = karpsravor_help s "" 
    where karpsravor_help s res 
      |s == "" && (last res) == 'o' = (init res) 
      |s==""=res 
      |otherwise = karpsravor_help (drop 3 s) (res ++ (consDecode (take 3 s))) 

consDecode :: String->String 
consDecode a 
    |(length a) < 3 = "" 
    |a == [(head a)]++"o"++[(head a)] = [(head a)] 
    |otherwise = a 

コードが完全に壊れたと下手に書かれた(ダム法)であるが、私はどのようにのために他のアイデアを持っていませんこれを解決する。助けてください!

+1

「head、tail」のような機能は部分的なものであり、空のチェックを忘れるとプログラムがクラッシュする可能性があります。可能であれば避けてください。彼らは安全であるので、代わりにパターンマッチングを好む慣習的なHaskellではありません。 '長さa <3 'もパターンマッチングに比べて非効率的である。 – chi

答えて

2

Pattern match「o」の出現を見つける。つまり、あなたが平等のために上記の、することはできませんパターンマッチでa:'o':a:restを持つことはできません

karpsravorhelp (a:'o':b:rest) res = ...

を使用します。

karpsravorhelp (a:'o':b:rest) res | a == b = ... | otherwise = ...

あなたはまたabはちょうど第1ガードのための「と」状態になります子音、あることを確認する必要があります:あなたは確かa == bことを確認するためにガードを使用する必要があります。 otherwiseの場合は、a:'o':b:'o':b:...のようなものがあるので、再帰呼び出しで(b:rest)が呼び出されるようにしてください。

他の2つのパターンを一致することを確認してください:

  1. 空のリスト、上記のパターンの後に行かなければならない[]
  2. x:rest、。この方法では、最初にa:'o':b:restパターンにマッチするように試みますが、それがなければ次の文字を入力してください。
1

これを行う1つの方法は、unfoldrからData.Listです。 case式を使用してa : 'o' : b : restのパターンマッチングを行い、abが等しく、ガードを使用している母音は|であることを確認できます。次に、パターンが一致しない場合の基本ケースを含めます。

notVowel :: Char -> Bool 
notVowel = (`notElem` "aeiouAEIOU") 

karpsravor :: String -> String 
karpsravor = unfoldr $ \str -> case str of 
    a : 'o' : b : rest 
     | a == b && notVowel a -> Just (a, rest) 
    a : rest     -> Just (a, rest) 
    ""       -> Nothing 
関連する問題