2016-05-24 15 views
0

でfoldlのを使用して再帰を実装する方法を、私は繰り返しを避けるために折る使用して、それを書き換えることができ、以下のコードハスケル

pair :: [String] -> [(String,String)] 
pair [] = [] 
pair (x:xs)= zip [x] xs ++ pair xs 

を与えられましたか?

+0

あなたはすでに試したことはありますか? –

+0

これを試してみましたが、リストのリストであるfoldl(++)[]とペアのリストを返す –

+1

Cool。あなたの質問にあなたのコードを入れるのは良いことです。だから、他の人が何が問題/エラーの原因になっているのか知っています。あなたはまた、あなたが期待している出力を入れることができますか? 'fold'を使ったあなたのバージョンは元のコードとは異なる結果を返します。 –

答えて

1

折り畳み機能は、折りたたみ機能がリスト内の以前に訪問された要素に依存し、2値リストの最小値に依存するため、この特定の問題に対してちょっと乱雑になります。また、折り畳みは一度に1つずつ要素を訪問するので、リストに要素が1つしかないときに何をすべきかを決定する必要があります。

ここでは、シングルトンリストの大文字小文字の要素を作成し、initで破棄する例を示します。

pair :: [String] -> [(String, String)] 
pair = init . foldr f [] 
    where 
    f x acc = 
     case acc of 
     [] -> [(x, "discarded")] 
     [email protected](y:_) -> (x, fst y) : z 

あなたは折り目について学習する使命を帯びている場合、我々はそのような不十分な方法でそれを処理するために持っている理由を理解するために時間がかかります。さもなければ、コードの最小量でこれを行うことを望んでいるならば、上記の@ DavideSpataroの答えはzip xs (tail xs)を見てください。