私はハスケルを学び、現在再帰的な "辞書"または "トランスレータ"関数を作成しようとしています。 基本的には、タプルやスティングの配列のようなスティッキングの配列を受け取って、最初のものと一致する場合はタプルの2番目の部分で置き換えられた要素の文字列を返します。 そこで、基本的ハスケル再帰的辞書関数の問題
["a", "b", "zz"] [("a", "11"),("b","c")]
から
["11","c","zz"]
に悩み、それは...これは私がこれまで持っているものである作る持つ:
aa (x:xs) (y:ys) = do
-- iterate through y
if ys == [] then return(x:xs) else aa (x:xs)(ys)
-- iterate through x
if xs == [] then return(x:xs) else aa (xs)(y:ys);
if x == fst(y)
then do
putStrLn("Yes");
return (snd(y):xs);
else return (x:xs);
配列の第一の要素のために働きました。 私はそれをどのように通過させるかを理解できないようです。 putStrLnを削除すると、エラー "不一致"が発生します。なぜですか?
それを理解しようとしながらも、結果を格納しようとした、それがうまくいかなかった:
aa (x:xs) (y:ys) = do
if x == fst(y)
then result <- snd(y):xs
else result <- x:xs
return result;
がエラーになった「パースエラーを入力 『< - 』におそらくこれは、にする必要があります'do'ブロック? "
一致するものが見つかると、もう一度繰り返すことはありません(コールaa)。また、はるかに簡単な実装は、タプルの配列をキーとしてfst()、値としてsnd()として辞書に入れます。次に、リストを繰り返します(これは再帰的でも非再帰的でも構いません)foreach要素であり、辞書内のそのキーの値を返します。そうでなければリスト内の値を返します(dict.getOrDefault(element、element)) – tpdi
'ys == []'が* whole *リストが空であるかどうかを調べてはいけません。あなたのコードは機能的ではなく不可欠であると言われています。そしておそらく、辞書の* single *値を調べることができる関数を書くことで、あなた自身がもっと楽になるはずです。 –
また、 'return'と' do'をたくさん使います。これらは 'Monad'関数です。通常、これらは純粋な関数では頻繁に見つかりません。 –