20

Haskell を使い始めたばかりで、リストを指定すると、2 番目の要素がすべて 2 倍になったリストを返す関数を書きたいと思いました。

これまでのところ、私はこれを思いつきました:

double_2nd :: [Int] -> [Int]
double_2nd [] = []
double_2nd (x:xs) = x : (2 * head xs) : double_2nd (tail xs)

どちらが機能しますが、皆さんがその関数をどのように書くのか疑問に思っていました. より一般的な/より良い方法はありますか、それともこれは正しいように見えますか?

4

6 に答える 6

22

スマート パターン マッチングを使用して、「空リスト」の例外を回避できます。

double2nd (x:y:xs) = x : 2 * y : double2nd xs
double2nd a = a

これは、次の単純な構文シュガーです。

double2nd xss = case xss of
    x:y:xs -> x : 2 * y : double2nd xs
    a -> a

パターン マッチングは順番に行われるため、最初xsにパターンと照合されます。x:y:xsそれが失敗した場合は、キャッチオール パターンaが成功します。

于 2013-06-29T18:08:52.483 に答える