2016-05-03 9 views
0

私はリストを取って、常に2つの要素を逆にしたい。 例:ハスケル、リストの2つの要素を逆にしますか?

入力1:[1,2,3,4,5]、出力1:[2,1,4,3,5]

入力2:[1,2,3,4,5,6]出力2:[2,1,4,3,6,5]

Iは、パターンマッチングでそれを試してみました:

g1 [] = [] 
g1 (x:y:xs) = y: x: g1 xs 

しかし、それは言います:

*Main> g1 [1,2,3] 
*** Exception: test.hs:(13,1)-(14,27): Non-exhaustive patterns in function g1 
g1 

誰かこの問題を解決するアイデアはありますか?

+0

g1 [x] = [x] 

または全体の関数定義要素。 – Lee

+2

1つの要素を含むリストに対して何をすべきか? –

答えて

4

問題は、たとえば[1,2,3,4,5]というリストにこれを適用した場合です。(ここでは[5]1つの要素を含んでい

g1 [1,2,3,4,5] 
= 1 : 2 : g1 [3,4,5] 
      = 4 : 3 : g1 [5] 

、リストに定義されたパターンはありません。それは以下のように実行します。あなたの最初の例に基づいて、要素を放出する以外は、このような場合には何もしないでください。だから、ケースを追加する必要があります:あなたは、リストが奇数のが含まれている場合、あなたがヒットする一要素リストのためのケースを追加する必要が

 
g1 [] = [] 
g1 [x] = [x] 
g1 (x:y:xs) = y: x: g1 xs 
+0

ああ、今私は理解する!私はハスケルが問題を解決するためにこの関数をどのように使っているのか分からなかった...ありがとう! –

関連する問題