1

初心者の Haskell コースの宿題の一部として、ブール値のペアのリストを取得し、ブール値のペアから「&&」で区切られたブール値のリストを返すプログラムを作成しようとしています。例えば...

andandbool [(True,True),(True,False),(False,True),(False,False)] 

戻ります:

[True, False, False, False]

しかし、私はトラブルに遭遇し続けます。私のコードは次のようになります。

andandbool :: [(Bool,Bool)] -> [Bool]
andandbool [a] = [fst x && snd x | x <- [a]]

1 つのペアのみのリストを提供する場合は問題なく動作しますが、複数のペアのリストを入力すると、「関数 andandbool の非網羅的なパターン」が報告されます。私が見逃しているある種のリスト内包表記はありますか? 正しい方向へのポインタは大歓迎です。

4

1 に答える 1

5

コンピューターの前にいるので、コメントを回答に変えます。

function の引数に名前を付けると[a]、Haskell はそれを 1 つの要素のリストに対する関数のパターン マッチングとして解釈します。そのため、関数は 1 つの要素のリストでしか機能しませんでした。これを修正するには、関数の引数の名前を括弧のない名前に変更します。

andandbool :: [(Bool,Bool)] -> [Bool]
andandbool as = [fst x && snd x | x <- as]

そのas引数は、任意のリストに一致するようになりました。

編集: @Ankur が述べたように、これを次のように簡略化できます。

andandbool as = [x && y | (x, y) <- as]

本当にコード ゴルフをプレイしたい場合は、次のようにさらに単純化できます。

andandbool = map (uncurry (&&))
于 2013-09-19T03:49:41.170 に答える